How to define a function that is Listable for some but not all arguments?
How about
f[x_List, y_] := f[#, y] & /@ x
f[x_, y_] := {x, y}
With this definition
f[{1, 2, 3}, y]
{{1, y}, {2, y}, {3, y}}
and
f[{1, 2, 3}, {a, b, c}]
{{1, {a, b, c}}, {2, {a, b, c}}, {3, {a, b, c}}}
You can directly use your definition as follows:
ReleaseHold@f[{1, 2, 3}, Hold@{a, b, c}]
(*{{1, {a, b, c}}, {2, {a, b, c}}, {3, {a, b, c}}}*)
Have a look at Thread
Thread[List[Range@3, y]]
{{1, y}, {2, y}, {3, y}}
Thread[List[Range@3, Sequence[x, y]]]
{{1, x, y}, {2, x, y}, {3, x, y}}