.ToLookup<TSource, TKey>retorna um ILookup<TKey, TSource>. ILookup<TKey, TSource>também implementa interface IEnumerable<IGrouping<TKey, TSource>>.
.GroupBy<TSource, TKey>retorna um IEnumerable<IGrouping<Tkey, TSource>>.
ILookup tem a propriedade indexer útil, portanto, pode ser usado de maneira semelhante a um dicionário (ou semelhante a uma consulta), enquanto o GroupBy não pode. O GroupBy sem o indexador é difícil de trabalhar; praticamente a única maneira de fazer referência ao objeto de retorno é fazendo um loop por ele (ou usando outro método de extensão LINQ). Em outras palavras, em qualquer caso em que GroupBy funcione, ToLookup funcionará também.
Tudo isso me deixa com a pergunta: por que eu deveria me preocupar com o GroupBy? Por que deveria existir?
Lookup, mas o GroupBycria quando o resultado é enumerado referenceource.microsoft.com/#System.Core/System/Linq/…
GroupByÉIQuerable,ILookupnão é