Intenta usar esponja de moreutils como esta:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Recopila toda la entrada antes de escribir en su salida.
Supongo que sed aún podría crear el archivo temporal, pero lo siguiente podría hacer lo que desea. (Usar strace en esto podría mostrarle si sed crea un archivo temporal o no).
sed -i '/bar/!d' foo.txt
La exclamación invierte la coincidencia, d es para eliminar, por lo que elimina todas las líneas que no tienen barra.