Conditional aggregate whilst constructing array
First of all you can simplify your Code to:

vm.GroupedData =
   times.Select(time =&gt;
      new { Ticks = time.Start.ToInstant().Ticks,
            Aggregate = results.Data
             .Where(data =&gt; time.Intersects(data.Date))
             .Select(data =&gt; data == null ? 0m : decimal.Parse(data.Value))
             .DefaultIfEmpty()
             .Max()
             //.Min()
             //.Average()
   });


1.) Remove the Select(v => v)

The Select doesn't actually do anythin in your case, you will get the same result without it. Select is used to project the single elements in your result into another format. E.g. get only a list of the Values insted of the whole object.

2.) Remove the DefaultIfEmpty()

With the DefaultIfEmpty you get a List containing only one "null" element. which would produce the same result as calling Max, Min or Average on an empty list.

3.) Transform the Results before using aggregates

Transform your result list to a list of all the values as decimal with a Select instead of doing this in each of the subfunctions. 

4.) Give x and i meaningful Names

5.) Use annonymous Type instead of object array or even better create own type for the tick-aggregate pair



To your actual question: Instead of calculating the Aggregate  you could store the IEnumerable in your result object and then do a second select on that result with your desired aggregate function. As long as you store the query as IEnumerable the query shouldn't be executed until you want to access the actual values of the result.

var myDataRowsPerTime = times.Select(time =&gt;
      new { Tick = time.Start.ToInstant().Ticks,
            DataRow = results.Data
             .Where(data =&gt; time.Intersects(data.Date))
             .Select(data =&gt; data == null ? 0m : decimal.Parse(data.Value))
             .DefaultIfEmpty()
   }); 

switch(aggregationMethod)
{
    case AggregationMethod.Avg:
        vm.Groupdata = myDataRowsPerTime.Select(item =&gt;
             new { Tick = item.Tick, Aggregate = item.DataRow.Avg() });
        break;
   case AggregationMethod.Max:
         ...


You should define a own class for the last result, there maybe a problem with accessing the Data of the annonymous Type in the viewmodel. The viewmodel doesn't know the structure of this annonymous type.