Hola PcKing.
Mira, para este caso basta con un solo while y los dos índices por ejemplo i,j.
La idea principal es copiar en cada iteración el caracter de la posición j a la posición i e incrementar el índice j de tal forma que cuando el caracter copiado es '\0' salimos del bucle. A su vez en cada iteración si el caracter copiado no es un espacio en blanco entonces incrementamos i para copiar el siguiente caracter, pero si fuera un espacio en blanco entonces se sobreescribe por el caracter copiado en la siguiente iteración.
Ejemplo:
Código:
void blanks(char* str)
{
int i = 0;
int j = 0;
while((*(str + i) = *(str + j++)) != '\0')
if((*(str + i)) != ' ')
i++;
}
Con esto solo trato de ejemplificar como puedes reducir a un solo while tu función, la implementación final que hagas pues ya te corresponde(toma en cuenta las consideraciones de MaxExtreme).
Saludos.