Você está próximo, eu acho - o seu principal problema é que $(cat file2) será tratado como literal entre aspas simples - você deve estar usando o comando r embutido:
r filenameFila o conteúdo do nome do arquivo a ser lido e inserido na saída fluxo no final do ciclo atual, ou quando a próxima linha de entrada é ler. Note que se filename não puder ser lido, ele será tratado como se eram um arquivo vazio, sem qualquer indicação de erro.
Então:
sed '
/foo/{
:a
N
/\nbar$/!ba
r file2
d
}
' file1
Se você quiser discutir isso em uma linha única, há um truque que você precisará evitar que o sed trate tudo depois do r como parte do nome do arquivo:
sed -e '/foo/{:a; N; /\nbar$/!ba; r file2' -e 'd;}' file1