I answered this question for indexed color schemes here:
How to change element color in Periodic Table?
The gradient color schemes have a simpler structure, e.g.:

However it seems unclear to me what the desirable semantics of a general function for gradient schemes would be. I think from your description that you wish to replace an existing color "swatch" with another one but do you know what that swatch is ahead of time? For example if you wanted to replace the third blue from the left how would you easily know its specific value? One does not even know the number of swatches used by Blend
without additional effort so a replacement by position is not convenient either. Nevertheless I shall pick that for this demonstration. If you can suggest a better approach I will attempt to implement it.
SetAttributes[withGradientScheme, HoldFirst]
withGradientScheme[body_, scheme_, {rules__} | rules_Rule] :=
With[{CS := DataPaclets`ColorDataDump`colorSchemes},
ColorData[1, 1] (*preload*);
Internal`InheritedBlock[{CS, ColorData},
Unprotect[ColorData]; Quiet[ColorData[scheme] =.];
CS = MapAt[ReplacePart[{rules}], CS, Append[5] /@ Position[CS, {{scheme, ___}, __}]];
body
]
]
Test:
withGradientScheme[
Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}, ColorFunction -> "TemperatureMap"],
"TemperatureMap",
1 -> Black
]

Last time I had a few bugs to work out and that may be true here as well as I haven't tested this extensively yet. Please let me know if you run into any problems with it.