I think you are confusing the query object with the results of that query. Your first variable doesn't contain the results, it contains a query object. At this point the query hasn't been executed. The execution is delayed until you actually need the results, and in your example this is done when you iterate in the foreach loop. This is why the first statement executes quickly but the iteration is slow.
If you want to store the results of the query in results
so that they are already calculated by the time you start the foreach loop then add a call to ToList().
var results =
(from a in Table
group a by a.Value into b
select new {Group = b}).ToList();