Как прикрутить многопоточную обработку без проблем с памятью?
Генерацию самих строк стоит оформить как IEnumerable, а их обработку - при помощи Task.
Не создавай много потоков.
Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
То, что ты описал, подходит под паттерн - производитель-потребитель.
Пример реализации