## Haskell, <s>52</s> 51 bytes

    map q
    q"z"="a"
    q x|x>"`"=succ<$>x|1<2=show$read x-1

As Haskell doesn't allow lists of mixed types, letters and numbers are taken and returned as strings.

[Try it online!](https://tio.run/##FctBDoIwEEDRPaeYTLq0iSUxbhguoiZMKhVixZZqGAlnt9rN@6s/cLr33mdH5/zgALGKuCIhYxVBNmmxQ0pvaxvVymaamtLwXNTc8xVEm/8zTkAQ5nF6gQIHcEJtcAe4L9SHY4kUPoUVL/lrnedbytqG8AM "Haskell – Try It Online")

Check for every list element: if the string is `"z"`, return `"a"`; if the first character of the string is > ``'`'`` (i.e. a letter, not a digit), return the successor of the char(s) in the string; else it must be number, so convert to an integer, subtract 1 and turn into a string again.

Edit: -1 byte thanks to @cole.