Алгоритмически это самый сложный и дорогой для Overload resolution алгоритма пример. Гораздо дороже любого LINQ. И студия (точнее Roslyn) тоже страдает, просто делает это аккуратнее по отношению к работе в background потоках (то есть менее заметно для пользователя). Можете отключить ReSharper, например, выделить кусочек кода и вырезать его через ctr-x — у меня затыкается надолго.
Сложность во вложенных друг в друга лямбдах, при том, что каждая из них завернута в вызов метода с перегрузками. Каждая перегрузка это точка ветвления: предположим она подойдет, что тогда будет с кодом, который внутри лямбды. Сами можете оценить дерево ветвления и его глубину. Там есть, конечно, еще нюансы и оптимизации, которые могут сильно помочь в каких-то других случаях — но в данном нет. Он самый суровый.
Что мы можем сделать — это поработать над отзывчивостью. Тут есть что улучшать и куда копать. Но по сути разогнать алгоритм Overload resolution здесь не слишком реалистично.