The only real (non-cosmetic) feature missing in bash that zsh has is process substitution using files. In bash you can use <() to capture the output of a pipeline into a filename, but it is implemented as a non-seekable pipe. In zsh, you have that, but you also have =() that gives you a real, temporary file. It is extremely useful in the rare cases when it is needed.
The only real (non-cosmetic) feature missing in bash that zsh has is process substitution using files. In bash you can use <() to capture the output of a pipeline into a filename, but it is implemented as a non-seekable pipe. In zsh, you have that, but you also have =() that gives you a real, temporary file. It is extremely useful in the rare cases when it is needed.