You need to give a colour map with more points, specifically with the "middle colour" of the map centred around your breakpoint, but with that colour being in the correct point of the colour map relative to the minimum and maximum values of your surface.
So if your desired breakpoint is 1/4 of the way between the min and max values of the surface, you could have a colour map with 100 rows where the 25th row contains the middle/breakpoint colour.
You can achieve this by interpolating from a an array including your breakpoint to something with consistent intervals. Please see the commented code below
% Set up a quick surface
[xa,ya] = meshgrid( pi:0.1:2*pi, 0:0.1:2*pi );
prof = cos(xa) * 2 + sin(ya) + 1;
figure(1); clf;
surf( xa, ya, prof );
% Set the breakpoint value
breakpoint = 1;
% Get the min and max values of the mesh, need this for scaling
minp = min( prof(:) );
maxp = max( prof(:) );
% Set up the colour map from a start and end colour
cstart = [0,0,1];
cend = [0,1,1];
% The average colour should happen at the breakpoint, so calculate it
cavg = mean( [cstart; cend] );
% Set up an interpolation, from our non-uniform colour array including the
% breakpoint to a nice evenly spaced colour map which changes the same
colours = [cstart; cavg; cend];
breakpoints = [minp; breakpoint; maxp];
colours = interp1( breakpoints, colours, linspace(minp,maxp,100) );
% Set the colour map
colormap( colours );
colorbar;
If you want a "sharp" delineation instead of a gradient then you can change the settings for interp1
to use previous instead of linear interpolation
colours = interp1( breakpoints, colours, linspace(minp,maxp,100), 'previous', 'extrap' );
Plot for breakpoint = 2

Plot for breakpoint = -1

plot for breakpoint = 1
but with nearest instead of linear interp

You could condense the colour map generation part of the code slightly, but I think this makes it a bit less clear what's going on
% Set the breakpoint value
breakpoint = 1;
% Get the min and max values of the mesh, need this for scaling
minp = min( prof(:) );
maxp = max( prof(:) );
% Get the interpolated ratio of one colour vs the other
ratio = interp1( [minp,breakpoint,maxp], [0,0.5,1], linspace(minp,maxp,100) ).';
% Create colour map by combining two colours in this ratio
colours = [0,0,1].*(1-ratio) + [0,1,1].*ratio;