По сути, любой запрос неиндексированного ресурса (такого как список или IEnumerable) будет в лучшем случае O (n), потому что он должен перебирать каждый элемент в списке, чтобы проверить условие. Чтобы достичь производительности лучше, чем O (n), вам нужно взглянуть на индексирование данных в некоторой форме.
Как вы упомянули, вы, вероятно, захотите взглянуть на библиотеку, чтобы завершить создание этих индексов, особенно если вы хотите предоставить только IQueryable.
Если вы заинтересованы в более ручном способе поиска данных с более высокой производительностью, то я бы посоветовал взглянуть на словари для эффективного поиска по ключу или, возможно, использовать b-деревья, если вам нужно выполнить запросы диапазона. Вот хороший MSDN пост о структурах данных, включая b-деревья, если вам интересна теория, лежащая в его основе. Также, NGenerics может быть интересным проектом для просмотра.