Generally speaking, don't use aliases. Instead, use functions as they are more versatile when the code they cover becomes more complex.
Using nvim $(fzf …), you unconditionally start nvim with whatever fzf outputs. One way would be to capture fzf's output, and based on its return code (which is greater than zero if you cancel it), do one thing or another, e.g. using &&:
f="$(fzf --preview='batcat --color=always {}')" && nvim -- "$f"
Here, I just ignored that you have used fzf's -m option to select multiple files, because this creates some issues. You could leave out the quotes to make spaces become separators but this will fail if you select files containing spaces themselves. Mitigating this is possible, but makes the code even more complex.
Another way would be to use fzf's built-in functions execute or become. The difference is whether fzf should be kept running in the background or not, i.e. whether after exiting nvim you want to return to fzf or not.
fzf --preview='batcat --color=always {}' --bind enter:'become(nvim {})'
In this case, introducing multiple selections is easy, as fzf provides with {+} a way to insert a space-separated list of arguments:
fzf -m --preview='batcat --color=always {}' --bind 'enter:become(nvim {+})'
To wrap it up, here are the alias and function implementations of the final snippet, with my recommendation to use the latter:
alias fe='fzf -m --preview="batcat --color=always {}" --bind "enter:become(nvim {+})"'
fe() { fzf -m --preview='batcat --color=always {}' --bind 'enter:become(nvim {+})'; }
batcat?batrat:-) but, yeah thanks for the info.