In entrambi i casi potrebbero succedere due cose, a seconda di come viene gestito il buffering su stdout.

Perché? Perché non è vero che printf stampa direttamente su schermo quello che le fornisci: essa va piuttosto a scrivere i dati in un buffer di output, per evitare di perdere tempo con tante piccole scritture; il buffer in questione viene svuotato in determinate circostanze in parte non specificate dallo standard (in genere quando è pieno, quando viene incontrato un ritorno a capo, quando viene richiesto dell'input all'utente, quando viene svuotato esplicitamente).

Quello che succede nel tuo caso è questo:
Primo esempio: la prima printf scrive nel buffer, che nel tuo caso è sufficientemente piccolo perché non venga scritto ancora niente su schermo; avviene la fork: il processo viene "clonato" - e con esso il buffer in scrittura; in ciascun processo viene poi chiamata la seconda printf; o all'interno di questa o alla chiusura del processo viene finalmente svuotato il buffer - in entrambi i processi, per cui il testo viene scritto interamente da entrambi i processi.
Nel primo caso potresti vedere sia:
codice:
The quick brown fox jumped over the lazy dogs
The quick brown fox jumped over the lazy dogs
Se invece si fosse svuotato il buffer prima della fork (o perché era particolarmente piccolo, o a seguito di una fflush(stdout)) il risultato sarebbe stato:
codice:
The quick brown fox jumped over the lazy dogs
the lazy dogs
perché al momento della fork il buffer sarebbe stato vuoto, per cui ciascun processo dopo la fork avrebbe stampato solo "the lazy dogs".

Nel secondo caso potresti vedere sia:
codice:
The quick brown fox jumped over the lazy dogs.
che:
codice:
the lazy dogs.
Perché? Stesso discorso: se il buffer viene svuotato prima della execl, allora la prima scritta viene stampata. Viene quindi richiamata execl, che rimpiazza il "contenuto" del processo corrente (salvo alcune cose) caricando in memoria echo con i parametri in questione. echo si occupa di stampare la scritta passata come argomento ed esce.
Se invece il buffer non viene svuotato prima della exec, allora il suo contenuto va perduto, dato che la exec rimpiazza codice e dati del processo corrente caricando in memoria l'eseguibile specificato.

Nota che tutto questo si applica ai buffer in usermode (come appunto quelli gestiti dalla libreria C), i buffer dei descrittori file UNIX invece dovrebbero essere conservati.