Multiply list of matrices by list of vectors

v = {{a1, a2}, {b1, b2}, {c1, c2}};

U = {
   {{{U1a11, U1a12}, {U1a21, U1a22}}, {{U2a11, U2a12}, {U2a21, U2a22}},  
    {{U3a11, U3a12}, {U3a21, U3a22}}, {{U4a11, U4a12}, {U4a21, U4a22}}}, 
   {{{U1b11, U1b12}, {U1b21, U1b22}}, {{U2b11, U2b12}, {U2b21, U2b22}},
    {{U3b11, U3b12}, {U3b21, U3b22}}, {{U4b11, U4b12}, {U4b21,U4b22}}}, 
   {{{U1c11, U1c12}, {U1c21, U1c22}}, {{U2c11, U2c12}, {U2c21, U2c22}}, 
    {{U3c11, U3c12}, {U3c21, U3c22}}, {{U4c11, U4c12}, {U4c21, U4c22}}}};

res = MapThread[#1.#2 &, {U, v}];

Map[MatrixForm, res, {2}]

Mathematica graphics


A few alternatives to MapThread, with res = MapThread[Dot, {U, v}] from Dr. belisarius' answer,

res1 = Dot @@@ Transpose[{U, v}];
res2 = Dot @@@ Thread[{U, v}];
res3 = Thread[dot[U, v]] /. dot -> Dot;
res4 = Activate[Thread[Inactive[Dot][U,v]]] (* if you have version 10 *);
Equal @@ {res1, res2, res3, res4, res}

True