Potresti chiedere come ulteriore parametro N quanti indirizzi si vogliono inserire ed allocare la memoria in conseguenza di questo, in questo modo il ciclo avrebbe solo N interazione e non dovresti chiedere se si desidera inserirne altri.
Oppure dovresti utilizzare realloc nel ciclo, questo manterrebbe la possibilità di inserire indirizzi finché l'utente dice stop ma non è il top dell'efficienza e bisogna riallocare con parsimonia (tipo ogni tot cicli).

Approccio 2
codice:
# define NEW_RECORDS 10
struct mail{
            char indirizzo[30];
        } *email = NULL;
        int i=-1; 
        int n=0;
        int allocazioni = 1;
        char scelta[2];
        email=(struct mail*)malloc(NEW_RECORDS*sizeof(struct mail)); //alloco inizialmente 10 posti
        do {
            i++;
            if (i == allocazioni * NEW_RECORDS){
                   email=(struct mail*)realloc(((allocazioni ++) * NEW_RECORDS)*sizeof(struct mail)); // realloc è dispendiosa, alloco 10 nuovi record per volta
            }
            printf("\nInserisci il %d° indirizzo email: ",i+1);
            scanf("%s", email[i].indirizzo);
            printf("\nNuovo indirizzo?: ");
            scanf("%s", scelta);
        } while (strcmp(scelta,"s")==0);
        for (n=0; n<=i; n++) {
            printf("\nMail nr.%d: %s",n+1,email[n].indirizzo);
        }
        free (email);