Ну, это зависит от того, что Вы хотели заблокировать (быть сделанными ориентированными на многопотоковое исполнение).
Обычно я выбрал бы OptionB для обеспечения ориентированного на многопотоковое исполнение доступа к m_Hash ТОЛЬКО. Где как OptionA, я был бы используемый для блокировки типа значения, который не может использоваться с блокировкой, или у меня была группа объектов, которым нужна блокировка одновременно, но я не делаю, что заблокировать целый экземпляр при помощи lock(this)
попробуйте сгруппировать по анонимному типу:
group by new { item.Col1, item.Col2 }
тогда вы сможете получить доступ к Key.Col1 и т. Д.