Riffle plus Append to ListPlot data of different lengths
How about
MapThread[Thread[{#1, #2}] &, {x, a}] // Flatten[#, 1] &
(* {{x1, 1}, {x2, 1}, {x3, 1}, {x3, 2}, {x4, 1}, {x4, 2}} *)
thread0 = Inner[Thread @* List, ##, Join] &;
thread0[x, a]
{{x1, 1}, {x2, 1}, {x3, 1}, {x3, 2}, {x4, 1}, {x4, 2}}
t = {1, 3, 5, 15};
ListLinePlot[thread0[t, a]]
You can also use:
thread1 = Catenate @* Map[Thread] @* Thread @* List;
thread1[x, a]
{{x1, 1}, {x2, 1}, {x3, 1}, {x3, 2}, {x4, 1}, {x4, 2}}
and
thread2 = MapThread[Apply[Sequence] @* Thread @* List];
thread2[{x, a}]
{{x1, 1}, {x2, 1}, {x3, 1}, {x3, 2}, {x4, 1}, {x4, 2}}
Using Splice
that was newly introduced in version 12.1:
Splice@*Thread /@ Transpose[{x, a}]
(* {{x1, 1}, {x2, 1}, {x3, 1}, {x3, 2}, {x4, 1}, {x4, 2}} *)