Em primeiro lugar; uma vez iniciado um processo, pode primeiro pará-lo em segundo plano (clique em Ctrl-Z) e depois digitar bg para que seja retomado em segundo plano. É agora um “trabalho”, e os seus stdout/stderr/stdin ainda estão ligados ao seu terminal. 
Pode iniciar imediatamente um processo em segundo plano anexando um “&” ao final do mesmo: 
firefox &
Para o executar em segundo plano silenciado, use o seguinte: 
firefox </dev/null &>/dev/null &
Algumas informações adicionais: 
nohup é um programa que pode utilizar ** para executar a sua aplicação com**, de modo a que a sua stdout/stderr possa ser enviada para um ficheiro e de modo a que o fecho do script dos pais não SIGHUPe a criança. No entanto, precisa de ter tido a previsão para o ter utilizado antes de iniciar a aplicação. Devido à forma como o nohup funciona, não pode simplesmente aplicá-lo a um processo em execução. 
disown é uma construção bash que remove um trabalho da shell da lista de trabalhos da shell. O que isto basicamente significa é que já não pode usar o fg, bg nele, mas mais importante, quando fecha a sua shell já não é pendurado ou envia um SIGHUP para aquela criança. Ao contrário do nohup, o disown é utilizado após o processo ter sido lançado e em segundo plano. 
O que você can’t do, é alterar o stdout/stderr/stdin de um processo depois de o ter lançado. Pelo menos não a partir da casca. Se iniciar o seu processo e lhe disser que a stdout é o seu terminal (que é o que faz por defeito), então esse processo é configurado para sair para o seu terminal. A sua shell não tem negócios com a configuração FD dos processos, isso é apenas algo que o próprio processo gere. O processo em si pode decidir se fecha ou não a stdout/stderr/stdin, mas não pode usar a sua shell para o forçar a fazê-lo. 
Para gerir a saída de um processo em segundo plano, tem muitas opções de scripts, sendo o “nohup” provavelmente o primeiro que lhe vem à cabeça. Mas para processos interactivos você começa mas esqueceu-se de silenciar (firefox < /dev/null &>/dev/null &) você não pode fazer muito, realmente. 
Eu recomendo que você obtenha o GNU screen. Com o ecrã pode simplesmente fechar a sua shell quando a saída do processo se tornar um incómodo e abrir uma nova (^Ac). 
Oh, e já agora, não use “$@” onde o está a usar. 
$@ significa, $1, $2, $3 …, o que transformaria o seu comando em: 
gnome-terminal -e "vim $1" "$2" "$3" ...
Isso provavelmente não é o que você quer porque -e só aceita um argumento. Use $1 para mostrar que o seu script só pode lidar com um argumento. 
É realmente difícil conseguir que vários argumentos funcionem correctamente no cenário que deu (com o gnome-terminal -e) porque -e leva apenas um argumento, que é uma string de comando shell. Você teria de codificar os seus argumentos num só. A melhor e mais robusta, mas um pouco desajeitada, maneira é assim: 
gnome-terminal -e "vim $(printf "%q " "$@")"