Con ogni probabilità dipende dal buffering... se stai scrivendo su file i dati non vengono scritti immediatamente, ma la libreria C li tiene in un buffer finché non si raggiunge una certa quantità di dati da scrivere (in modo da inviare i dati solo a grossi blocchi, per evitare di fare syscalls ad ogni momento). Probabilmente in questo caso scrivi una quantità di dati sufficientemente piccola da non riempire il buffer, per cui i dati vengono scritti tutti solo al momento della chiusura del file; il primo processo, che è partito prima, probabilmente chiude il file per primo e scrive tutti i dati, quindi fa lo stesso il secondo.
Potresti ottenere output mischiati inserendo una fflush dopo ogni scrittura, in modo da forzare il flushing del buffer su file prima della fine del programma.