Dopo l'allocazione dinamica, il puntatore m avrà un certo valore, diciamo 0x1234. Viene dunque decrementato di 1, il che significa che il suo valore viene decrementato di tanti byte quanti sono quelli che costituiscono il tipo di dato a cui il puntatore punta: se m è un puntatore a int e un int è su 4 byte, il valore di m una volta decrementato sarà 0x1230.
A quel punto nei due for successivi utilizzi gli indici a partire da 1 fino a 10 (anziché 0-9) perché scrivendo m[1] di fatto stai accedendo alla locazione di memoria successiva a quella dell'indirizzo base, ma visto che questo era stato decrementato di una posizione allora stai accedendo proprio alla prima componente dell'array allocato, utilizzando però l'indice 1 anziché 0 come sarebbe normalmente.
Prova a stampare un po' i valori degli indirizzi per renderti conto di tutto questo.
Quello che mi chiedo è come possa non darti un errore runtime l'istruzione free(m) visto che m, essendo stato decrementato, non è il valore originario dell'indirizzo al partire dal quale è stata allocata la memoria... dovresti sostituire quell'istruzione con free(m+1); o simili.