Em
echo 'one' > /tmp/a
O shell faz um open(O_WRONLY) no pipe e depois gera echo , que então faz o write("one\n") .
O open será bloqueado até que algum outro processo abra o canal em RD_ONLY ou RD_WR .
E também o open do seu echo two .
Então, no momento em que você faz more /tmp/a , você tem dois processos prontos para disparar que ainda não abriram o fifo, e muito menos escreveram alguma coisa para ele. Qual desses dois será agendado assim que more fizer o open(RD_ONLY) ser aleatório.
Para evitar o bloqueio, você pode fazer:
exec 3<> /tmp/a
para desbloquear o pipe primeiro e, em seguida, executar seus comandos que não serão bloqueados até que o pipe esteja cheio.
Note, entretanto, que o acima funcionará no Linux, mas não em todos os Unix ou Unix-like. O comportamento ao abrir um pipe no modo de leitura e gravação não é especificado pelo POSIX.