From Benjamin's answer (thanks!), I was able to find a solution. It seems that there's a problem because by setting the DataAspectRatio and leaving the PlotBoxAspectRatio to 'auto', the ratio remains constant whatever the zoom. So I wrote the following code for ax the axis containing my surface:
zoomObj=zoom(ax);
set(zoomObj,'ActionPostCallback',@(o,e)zoomCallback(ax));
zoomCallback(ax); % initialization, which is equivalent to an axis equal
function zoomCallback(ax)
limits = axis(ax);
xRange = diff(limits(1:2));
yRange = diff(limits(3:4));
centerX = mean(limits(1:2));
centerY = mean(limits(3:4));
ax.PlotBoxAspectRatio(1:2)=[xRange yRange];
axis(ax,[centerX - xRange/2, centerX + xRange/2, centerY - yRange/2, centerY + yRange/2]);
end