InsertClient riceve una locazione di memoria che contiente un puntatore. Ecco il motivo del doppio puntatore.
In quanto al "per forza" ho i miei dubbi. Non sta scritto da nessuna parte che è necessario.
E a dirla tutta io non userei nemmeno un puntatore per Client.
codice:// Funzione InsertClient: Funzione che mi permette di inserire un cliente Client* InsertClient(int i) // il riferimento è inutile. { string name, surname; int age; cout << "This is the client number: " << i + 1 << endl; cout << "Insert Name: " << endl; cin >> name; cout << "Insert Surname: " << endl; cin >> surname; cout << "Insert Age: " << endl; cin >> age; return new Client(name, surname, age); } ... case 1: { clients[i] = InsertClient(i); i++; break; } ...