E porque no primeiro malloc eu uso char* e no malloc dentro do for eu uso apenas char ?
Vamos por partes. Uma matriz é, basicamente, um vetor de vetores. Para acessar um vetor por ponteiros, você usa tipo*. Para acessar um vetor de vetores através de ponteiros, você usa tipo**. É um ponteiro de ponteiro .
Por isso mapa é char**.
Cada linha de mapa é um vetor de char, acessado através de um ponteiro do tipo char*. Por isso você diz que mapa tem o tamanho de sizeof(char*) * linhas.
Ou seja, cada ponteiro para linha da matriz tem o tamanho de um ponteiro char. Como temos linhas, então multiplicamos o tamanho de um ponteiro pela quantidade de linhas.
Já mapa[i] aponta para um vetor de valores do char, e não de ponteiros. Por isso precisamos saber o tamanho de um char, ao invés do tamanho do seu ponteiro.
Por isso o segundo for não tem asterisco para o malloc:
mapa[i] = malloc(sizeof(char) * colunas + 1);