Eu não acho que tenha algo a ver com nohup . Você obtém o mesmo comportamento quando executa python a.py > a.log 2>&1 .
O Python provavelmente está usando o arquivo C stdio abaixo. Com isso, stdout , quando em um terminal, será armazenado em buffer de linha e armazenado em buffer quando stdout for um arquivo. stderr está sempre sem buffer.
Redirecionar stdout para um arquivo alternará o armazenamento em buffer de stdout do buffer de linha para o buffer e fará com que a sequência print ed fique presa no buffer, que só é liberada quando o programa (o fluxo) fecha. O fluxo stderr chega ao arquivo mais rápido porque não está bufferizado.
Você pode usar stdbuf para ajustar o buffer padrão, forçando as linhas a serem impressas na ordem correta:
stdbuf -o0 python a.py >a.log 2>&1