Você precisa manter a conexão SSH em segundo plano. O e comercial no final do comando faz isso e eu estou passando o sinalizador N também para parar um shell rodando no final remoto (economiza um punhado de recursos e impede que o SSH fique estropiado sobre ter um console conectado):
#/bin/bash
ssh -NL 5900::5900 user@ &
sleep 1
vncviewer 127.0.0.1:5900
Eu costumava fazer algo semelhante, mas executar o x11vnc no computador remoto, sob demanda. Isso teve o efeito colateral adicional de que ele estava ativo enquanto o x11vnc estava rodando ... E isso termina depois da primeira desconexão (desejável!):
#/bin/bash
ssh -L 5900::5900 user@ "x11vnc" &
vncviewer 127.0.0.1:5900