Many many possibilities, I give you two other ways:
Join @@ MapThread[Thread[{#1, #2}] &, {l1, l2}]
Transpose[{Join @@ MapThread[ConstantArray, {l1, Length /@ l2}], Join @@ l2}]
Depending on the types of data (all numerical, symbolic, mixed) one method will be faster than the other...
NB. Note that Flatten[...,1] is the same as Join @@ ... , but the latter is generally faster (or in the worst case, equal). I'm not sure how it compares to Catenate @ ... though, I have a feeling it is a more 'higher-level' function, and probably slower...