Я смотрю, у вас какой-то XML ридер особый. Многое зависит от его реализации, а именно - его потокобезопасности.
В принципе, у вас главный foreach можно распараллелить следующим образом:
Делаем по
шаблону "производитель-потребитель"
Производитель у вас будет один - ваш ридер, который должен "поставлять" ссылки на отдельные узлы вашего файла. Потребителем должны стать потоки, хватающие первый попавшийся (и учтите это сразу - они будут хватать не по порядку, а именно - первый попавшийся узел) и парсящие их.
Количество потоков подобрать под конкретное железо, либо (если есть желание заморочиться) можно сделать настраиваемым - начать с 4 потоков, считать среднюю скорость обработки узлов (кол-во узлов в минуту), вводить по одному потоку в минуту, измеряя, увеличилось ли время или уменьшилось. Если время увеличилось - возвращаем прежнее количество, если уменьшилось - добавляем ещё поток, пока не найдём оптимальный вариант.