Dunque subito salta all'occhio che non inizializzi gli array. Male, male.

Nella funzione di copia dell' array di fatto non copi proprio niente. Penso che tu abbia sbagliato il for: attualmente farà al piu' una copia, dato che il controllo successivo causerà il ritorno dalla funzione (che rand sia 0 o 1).

Lo srand di solito va fatto una sola volta. Spostalo nel main.

Con questo codice a me funziona. Dopo alcuni nack per i vari pacchetti, tutti e 4 vengono "spediti"

codice:
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>

int destinatario(int pac[],int *conf){

	int ricevuti[4],j;
	for(j=0;j<4;j++){
		ricevuti[j]=pac[j];//copio l'intero array in un altro
	}
		*conf=rand()%2;//genero numero casuale e ritorno a mittente
		if(*conf==1)
			return 1;
		else return 0;
}

void mittente(){

	int pacchetti[4]/*array pacchetti*/,i;
	int conferma,risp;

	for(i=0;i<4;i++){
		printf("\n\nSpedizione pacchetto numero %d\n",i+1);
		conferma=destinatario(pacchetti,&risp);//invio l'array a destinatario
		if(conferma==1){// condizioni per proseguire col prossino elemento oppure rinvio dello stesso.
			printf("\nAck ricevuto\n");
		}
		else{
			printf("\nNack ricevuto\n");
			i--;//qui decremento l'indice per la rispedizione del pacchetto
		}
	}
}

int main(){
	
	srand(time(NULL));

	printf("********************** SIMULAZIONE**********************\n");


	printf("\n\nInizio spedizione pacchetti........\n");
	mittente();//invoco la funzione

	printf("\n********************** TERMINAZIONE SIMULAZIONE**********************\n");

}

Ho tolto gli Sleep perchè non ce la facevo ad aspettare 30 anni per ogni output