Il return usato in quel modo fa sì che la funzione esca immediatamente. In ogni caso, si può riscrivere anche senza return:
codice:
void stampa(pNodo curr)
{
    if(curr) // ovvero, if(curr!=NULL)
    {
        stampa(curr->next);
        printf("%d\n", curr->elem);
    }
}
Per capire come funziona, prova a "fare finta" di essere il computer ed eseguire questa funzione su una lista con pochi (3 o 4) elementi, vedrai che non è difficile (a patto di avere un minimo di dimestichezza con la ricorsione ).