次のような moreutils のスポンジを使用してみてください:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
出力に書き込む前に入力全体を収集します。
sed はまだ一時ファイルを作成する可能性があると思いますが、次のようにするとうまくいくでしょうか? (これでstraceを使用すると、sedが一時ファイルを作成するかどうかが表示される場合があります)。
sed -i '/bar/!d' foo.txt
感嘆符は一致を反転します。d は削除を意味するため、バーを含まないすべての行が削除されます。