Although !echo $SHELL
may be wrong, :set shell=/bin/zsh
does seem to work.
Like you, I also get /bin/bash
for !echo $SHELL
. But if I try to run a non-existent command:
:!blah
zsh:1: command not found: blah
shell returned 127
So it looks like the setting works, and commands will be executed in the right shell.