MapThread[ expr /. {u -> #1, x -> #2[[1]], y -> #2[[2]]} &, {uRep, xyRep}]
works as expected. So doesdo
(expr /. {u -> #1, x -> #2[[1]], y -> #2[[2]]}) & @@@ Transpose[{uRep, xyRep}]
Bothand
(expr /. Thread[{u, x, y} -> ##]) & /@ (Flatten /@ Transpose[{uRep, xyRep}])
All three give
{u1 == a1 + a2 x1 + a3 y1, u2 == a1 + a2 x2 + a3 y2, u3 == a1 + a2 x3 + a3 y3}