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;
			}
...