This code gives the result I need, but there must be a better way. Any ideas?
l1 = {1, 2, 3}
l2 = {{a1, b1, c1, d1}, {a2, b2, c2}, {a2, b2, c2}}
Flatten[Module[{t},
MapThread[(#2 /. t -> #1) &,
{l1, Map[{t, #} &, l2, {2}]}
]
], 1
]
The result is: {{1, a1}, {1, b1}, {1, c1}, {1, d1}, {2, a2}, {2, b2}, {2, c2}, {3, a2}, {3, b2}, {3, c2}}