Путем тщательного анализа ситуации и оценочного моделирования я пришел к гипотезе, что используемый Вами Index — глобальная переменная, общая для всех потоков.
D>Нужна ли здесь Критическая секция?
Хм. Полагаю, теоретически она могла бы исправить этот эффект — ценой превращения "фиктивной многопоточности" (когда потоки работают строго по очереди) в "сериализированную многопоточность" (когда поток запускается не раньше, нежели предыдущий полностью отработает).
D>Как вообще действовать в этом случае (несколько одинаковых потоков работают с ListView)?
Как правило — завести объект-диспетчер, который (с помощью той же критической секции) умеет принимать вызовы из разных потоков и который работает с ListView.