A partir do script bash, você inicia um subprocesso (executando um programa em Python) e cria um canal a partir dele para o script bash.
Após a saída do script bash, não há mais nenhum processo que tenha o canal aberto para leitura. Portanto, da próxima vez que o script Python escrever algo no pipe, ele receberá um sinal SIGPIPE e morrerá. Você veria o erro resultante se apenas redirecionasse a saída padrão para o pipe e também não para o erro padrão.
Mesmo se o script Python ignorasse o sinal SIGPIPE, ele ainda morreria ao gravar no pipe porque a gravação no pipe falharia, o que acionaria uma exceção.
Se você quiser ver apenas a linha que informa que o servidor está pronto, ou até a linha sobre a primeira solicitação, uma maneira simples é manter um leitor em execução:
exec 3< <(python3 -u -m http.server 2>&1 )
{ while true; do
…
done;
exec cat;
} <&3
Você pode querer redirecionar o erro padrão para um arquivo de log em algum lugar, em vez de ignorar alegremente as mensagens de erro.
Uma abordagem alternativa seria escrever algumas linhas do Python, sobrescrevendo o método BaseHTTPRequestHandler.log_request
para emitir uma entrada de log apenas na primeira vez.