L'approccio più semplice per la modifica "in-place" è quello di usare un puntatore in lettura e uno in scrittura; per controllare se il carattere va bene puoi usare la funzione strchr per cercare nella stringa contenente i soli caratteri validi. Esempio:
codice:
#include <cstring>

// ...

void PurgeString(char * Str, const char * Valid)
{
    const char * readPtr=Str;
    char * writePtr=Str;
    while(*readPtr)
    {
        if(std::strchr(Valid,*readPtr)!=NULL)
            writePtr++;
        *writePtr=*readPtr;
        readPtr++;
    }
    *writePtr=0;
}

// ...
char stringa="Ciao mondo!";
char valid="AEIOUaeiou";
PurgeString(stringa, valid);
// stringa ora vale "iaooo"
D'altra parte, se tutto quello che vuoi è semplicemente tenere i caratteri alfabetici e maiuscoli, ti basta usare la funzione std::isupper per il controllo del carattere, che è molto più veloce che iterare su tutto un array ad ogni carattere (la funzione diventa O(N) invece di O(N*M), con N lunghezza della stringa e M numero di caratteri validi).