Stai inserendo tutti i dati nel primo elemento dell'array allocato dinamicamente:
deck->type e deck->phrase sono equivalenti a fare deck[0].type e deck[0].phrase.
Puoi risolvere in 2 modi: tieni un indice per capire dove vai a scrivere o incrementi il puntatore per scorrere l'array.

In ogni caso se conosci a priori la dimensione del mazzo quello non è il modo corretto di leggere il file, infatti così non consideri i casi di errore in cui ci siano più o meno elementi.

Un altro "errore" è che la tua funzione non restituirà nulla al main. Per allocare un array in quel modo o lo ritorni come valore della funzione o prendi come parametro un puntatore "extra":

codice:
void deckCreationMedium(Card **deck) {
  Card *ret = (Card *)malloc(MEDIUM * sizeof(Card));
  //...
  //...
  *deck = ret;
}

//main
Card *deck;
deckCreationMedium(&deck);