Estou voltando para revisitar isso depois de 4 anos porque, enquanto minha suposição original funcionou, funcionou da maneira errada, ou seja, estava recuperando todos os registros do Mongo e filtrando-os na memória e, para compor as coisas, estava fazendo uma chamada síncrona no banco de dados, o que é sempre uma má ideia.
A mágica acontece no método de extensão de expansão do LinqKit
Isso nivela a árvore de expressão de invocação em algo que o motorista do Mongo pode entender e, assim, agir.
.Where(predicate.Expand())