Здесь явное злоупотребление каналами. Я бы даже сказал, что не правильное их использование. Если получая из канала сообщение, тут же запускаешь горутину, то какой смысл в канале? Можно сильно упростить, убрав канал и переделав на вызов функции.
Парсинг сделать бы вот с этой штукой
WaitGroup. Собрать все ссылки и только потом писать в мапы. И вот тут-то и нужен локер для конкретной мапы, ну или так же через канал можно реализовать.
Что касается паники в текущей версии, похоже, что происходит в момент считывания мапы в функции
ReplacationFileSystem. Никакого локера там нет. В это же время другая рутина может писать в эту же мапу.