Haskell, 52 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.
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.