This seems to have been done by design, but I cannot see a valid reason for this and it could be a little dangerous when being used to control the valid values entered.
By putting the following in the OnChange event I've managed to get around the problem. Not sure if there is a better solution.
if (Sender is TSpinEdit) then
begin
if (Sender as TSpinEdit).Value > (Sender as TSpinEdit).MaxValue then
begin
(Sender as TSpinEdit).Value := (Sender as TSpinEdit).MaxValue;
end;
end;