Um programa de linha de comando pode receber informações de um usuário através de duas fontes: de stdin (para o qual você está direcionando), e anexando diretamente ao TTY. Coisas ruins podem acontecer quando estas são misturadas. O Vim não quer ler a entrada de um tubo, quer você, o usuário, diretamente. Então vamos dar o real stdin de volta.
Como solução, podemos usar uma substituição de comando para passar diretamente os arquivos como argumentos para o Vim:
vim -p $(find . | xargs fgrep -l myExpression)
Note que, devido às expansões executadas pelo shell, isso não manipula arquivos com espaços em seus nomes corretamente, mas meu Bash-fu é muito fraco para saber uma correção fácil.
Além disso, find options | xargs some command
pode ser escrito como find options -exec some command {} +
, o que pode ser considerado mais elegante.