As Szabolcs stated, Maximize is calling NMaximize.
The problem is that the call is not being done with appropriate options for your case. Just compare for example:
NMaximize[{x*(1 - 0.01 x), x ∈ Integers}, x]
(*
x-> 19
*)
with
NMaximize[{x*(1 - 0.01 x), x ∈ Integers}, x, MaxIterations -> 300]
(*
x-> 50
*)
To understand better what is happening you may see the evaluation process:
f[x_] := x*(1 - .01 x);
{sol, pts} = Reap[
NMaximize[{f[x], x ∈ Integers}, x, MaxIterations -> 300,
EvaluationMonitor :> Sow[{x, f[x]}]]];
{sol1, pts1} = Reap[
NMaximize[{f[x], x ∈ Integers}, x,
EvaluationMonitor :> Sow[{x, f[x]}]]];
GraphicsGrid[{{
Plot[f[x], {x, 0, 100}, Epilog -> Map[Point, Cases[First[pts] , x_]]],
Plot[f[x], {x, 0, 100}, Epilog -> Map[Point, Cases[First[pts1], x_]]]}}]

Edit
As Szabolcs commented below, the evaluation process is far from efficient.
Here you have the number of evaluations done for each integer x while the algorithm is trying to find the Max:
Histogram[(First@pts1)[[All, 1]], {-1, 20, 1}, AxesLabel -> {"x", "# of evals"}]

Edit
You could run
Histogram[Select[Length /@ Split@(First[pts1][[All, 1]]), # > 1 &]]
To see that it evaluates the same x several times is a row!