Prova a utilizzare sponge di moreutils in questo modo:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Raccoglie l'intero input prima di scrivere nel suo output.
Immagino che sed potrebbe ancora creare il file temporaneo, ma quanto segue potrebbe fare quello che vuoi? (L'uso di strace su questo potrebbe mostrarti se sed crea un file temporaneo o meno).
sed -i '/bar/!d' foo.txt
L'esclamazione inverte la corrispondenza, d sta per delete, quindi rimuove tutte le righe che non contengono una barra.