Você pode usar o -l sinalizador de expansão :
l:expr::string1::string2:
Pad the resulting words on the left. Each word will be truncated if required and placed in a field expr characters wide.
The arguments :string1: and :string2: are optional; neither, the first, or both may be given. Note that the same pairs of delimiters must be used for each of the three arguments. The space to the left will be filled with string1 (concatenated as often as needed) or spaces if string1 is not given. If both string1 and string2 are given, string2 is inserted once directly to the left of each word, truncated if necessary, before string1 is used to produce any remaining padding.
If the MULTIBYTE option is in effect, the flag m may also be given, in which case widths will be used for the calculation of padding; otherwise individual multibyte characters are treated as occupying one unit of width.
If the MULTIBYTE option is not in effect, each byte in the string is treated as occupying one unit of width.
Control characters are always assumed to be one unit wide; this allows the mechanism to be used for generating repetitions of control characters.
Tente:
zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'