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}}