Perché dovrebbe?
"Ciao Mondo" è uno string literal, e quindi un puntatore ad una stringa che sta da qualche parte in memoria, e il suo tipo è char *. Nel momento in cui lo assegni a p non succede nulla di strano: p semplicemente punterà alla stringa "Ciao Mondo".
Per inciso, il C è un linguaggio a tipizzazione statica, dopo che hai dichiarato una variabile questa non può cambiare di tipo, quindi dire che p "diventa" un puntatore a puntatore non ha molto senso.

(comunque, sarebbe meglio usare const char *, visto che gli string literal non vanno modificato pena undefined behavior - e non a caso in C++ il tipo degli string literal è const char *)