I observed that you included a timing _before_ the plot, you missed a timing _after_ the plot. Moreover, it appeared to me that `TimeObject` has quite an overhead, so I order to get "purer" timings, I replaced it by `AbsoluteTime[]`.  This is what I used for timings:

    points = 100;
    opts = {PlotPoints -> points, MaxRecursion -> 0};
    timing = Module[{i, start, results}, i = 0;
       results = Reap[
         Sow[{start = AbsoluteTime[], i++/points^2}];
         p = Plot3D[x y, {x, -2, 2}, {y, -2, 2},
           Evaluate[opts],
           EvaluationMonitor :> Sow[{AbsoluteTime[], i++/points^2}]
           ];
         Sow[{AbsoluteTime[], i++/points^2}];
         ];
       {#1 - start, #2} & @@@ results[[2, 1]]];

Then I got this

[![enter image description here][1]][1]

So it's not for sure that there is no plateau for the normal-free case. I'd say that a major part of the plateaus in the end are due to the mesh lines because they get shorter with `Mesh -> None`. These are the timings without the mesh lines:

[![enter image description here][2]][2]

Moreover, there is some time needed to compute the polygon index lists for the final `GraphicsComplex`. This won't need any point evaluations (the points are already evaluated), so this will also contribute the the plateaus. 

Notice also the small shift between the yellow and the first blue ramp. This could be the [infamous 50 ms](https://mathematica.stackexchange.com/questions/4700/shaving-the-last-50-ms-off-nminimize) that might be due to compilation of the normal function into `"WVM"`.


  [1]: https://i.sstatic.net/jHUrV.png
  [2]: https://i.sstatic.net/S67l7.png