tu allochi memoria e salvi il puntatore in posizione numObj, però incrementandolo subito dopo vai a fare il cast con il "puntatore" in posizione numObj+1 ,che ancora impostato e non si sa dove va a puntare

codice:
puntObj[numObj] = malloc(sizeof(Rettangolo));  // numObj = 0, puntObj[0] punta alla memoria allocata
if (puntObj[numObj] != NULL ) numObj++; // così diventa 1
puntRect = (Rettangolo*) puntObj[numObj]; // numObj = 1 fai il cast con puntObj[1] .... sicuro che contiene un riferimento valido?
puntRect -> ObjID = 2; //puntRect a cosa punta?