Não sei se entendi sua pergunta, mas seu código pode ser otimizado para:
awk 'NR==FNR{a[$0]="";next}; !($0 in a)' foo/file bar/file > tmp
(você teve problemas com linhas vazias ou linhas resolvendo "0" nelas, eu acho)
Se os arquivos estiverem classificados, você poderia fazer:
comm -13 foo/file bar/file > tmp
Se não forem (sintaxe ksh93. zsh ou bash):
comm -13 <(sort foo/file) <(sort bar/file) > tmp
(não necessariamente mais rápido que a solução awk)
Além disso, especialmente com o GNU awk, você pode obter um melhor desempenho definindo a localidade como C / POSIX:
LC_ALL=C awk ...