Você não pode (com segurança) redirecionar a saída de um comando para um arquivo que está sendo lido. Você está "com sorte" por ter funcionado na linha de comando. Provavelmente, em um caso sed foi capaz de ler o arquivo inteiro antes que o shell o derrotasse, e no outro caso não foi. A diferença é provavelmente devido a algum problema de buffer, mas não vale a pena descobrir isso.
Se você quiser modificar um arquivo, você deve gravar a saída em um arquivo temporário e (se tiver êxito) renomear o arquivo temporário para o nome do arquivo de entrada.
Por exemplo:
sed "1s%.*%baz%" test.txt > $$ && mv $$ test.txt
$$ é o ID do processo do shell atual; é uma maneira conveniente de obter um nome de arquivo razoavelmente exclusivo. Ou você pode usar, digamos, test.txt.$$ ou mesmo tmp se não tiver algo com esse nome.
No caso particular do comando sed , você pode usar a opção -i para modificar um arquivo - mas isso só faz com que sed crie um arquivo temporário internamente. A sintaxe, ou mesmo a existência, se a opção -i puder variar de uma implementação sed para outra; verifique sua documentação local.