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.