guarda che ti stai confondendo parecchio... questo è quello che succede nel ciclo:

1) i viene settato a 0
2) [cycle]
viene invocata la funzione strlen() su stringa e viene restituito un valore; questi viene comparato con i. Se i è maggiore o uguale al valore ritornato allora il ciclo termina, altrimenti viene eseguita l'istruzione e successivamente i viene incrementato di 1. Il ciclo viene ripetuto. Come vedi, il valore di ritorno di strlen() non viene salvato da nessuna parte ma viene calcolato ogni volta.

Nel secondo caso invece:

1) ad l dai il valore del ritorno di strlen() su stringa.
2) i viene settato a 0
3) [cycle]
se i è maggiore o uguale ad l il ciclo viene interrotto, altrimenti viene eseguita l'istruzione e successivamente i viene incrementato di uno. Come vedi qui si che viene salvata sullo stack (all'indirizzo di l) il valore di ritorno di strlen().

La seconda versione sarà più veloce della prima ma occuperà più spazio in memoria.

bye