Один из вариантов (как следует из названия моего вопроса) - активно разбивать строку вручную, а не интерпретировать переменную как список в первую очередь:
string(REPLACE "\n" ";" ADDITIONAL_PROJECT_FILES_LIST ${ADDITIONAL_PROJECT_FILES})
Это работает для меня, но было бы очень хорошо иметь что-то более абстрактное и менее специфичное для платформы (например, я не знаю, работает ли это на всех ОС, включая Windows)
Что-то вроде execute_process(COMMAND find -type f OUTPUT_LIST_VARIABLE MY_LIST)
Или хотя бы set(MY_LIST FROM_MULTILINE MY_MULTILINE_STRING)