Как разбить парсинг XML файла на несколько потоков в C#?
В добавок к сказанному у cicatrix 
заменить циклы foreach наParallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
При помощи библиотеки Task-based Asynchronous Programming
Это избавит от необходимости вКоличество потоков подобрать под конкретное железо, либо (если есть желание заморочиться) можно сделать настраиваемым - начать с 4 потоков, считать среднюю скорость обработки узлов (кол-во узлов в минуту), вводить по одному потоку в минуту, измеряя, увеличилось ли время или уменьшилось. Если время увеличилось - возвращаем прежнее количество, если уменьшилось - добавляем ещё поток, пока не найдём оптимальный вариант.
Я смотрю, у вас какой-то XML ридер особый. Многое зависит от его реализации, а именно - его потокобезопасности.
В принципе, у вас главный foreach можно распараллелить следующим образом:
Делаем по шаблону "производитель-потребитель" 
Производитель у вас будет один - ваш ридер, который должен "поставлять" ссылки на отдельные узлы вашего файла. Потребителем должны стать потоки, хватающие первый попавшийся (и учтите это сразу - они будут хватать не по порядку, а именно - первый попавшийся узел) и парсящие их.
Количество потоков подобрать под конкретное железо, либо (если есть желание заморочиться) можно сделать настраиваемым - начать с 4 потоков, считать среднюю скорость обработки узлов (кол-во узлов в минуту), вводить по одному потоку в минуту, измеряя, увеличилось ли время или уменьшилось. Если время увеличилось - возвращаем прежнее количество, если уменьшилось - добавляем ещё поток, пока не найдём оптимальный вариант.