I've thought about writing a plugin to do that, but haven't gotten around to it. I suggest such a plugin would have ranges for the hue, saturation, and value, and per-component control over how much the values should be concentrated around the center: from being spread equally through the range to being mostly near the original value. The hue range would, of course, have to handle the circular wrap-around. Perhaps there could be a choice of whether the changes are centered at the original value, or only change upward or downward (that might be overkill). The transparency should be preserved, or maybe it could also be randomly alterable. That, too, might be overkill, and would require care not to make an object pixel completely transparent.
Each pixel in an object should, I think, have the same modifications, but the modifications should be relative to the pixel's initial color. That would preserve variations within the object. In essence, it would randomly apply the Hue/Saturation Adjustment to each object. There would probably need to be a buffer of flags for whether a particular pixel had been processed, since there's no easy for the fill routine to tell by the state of a pixel whether it had been modified,
Maybe I'll try to write such a plugin. If anyone else is interested, they might benefit from my comments about and code from the Average Object Color plugin. Though the code I show is for CodeLab, Visual Studio would be a much better choice. The simplest, and perhaps best, choice is to do most everything in OnSetRenderInfo. The modified version could be created in auxiliary surface. The surface could be initialized to a transparent color (or colors), which would serve as flags for processed pixels (since no pixel within an object is transparent). The Render threads would simply copy the pixels to the dst buffer. A fancier choice is to have an integer buffer the same size as the canvas or selection. As a one-time operation, create numbered images for each object, along with a record for each object which would contain the amount of HSV modifications to apply. Then in OnSetRenderInfo, initialize the modification amounts, and in Render, apply them, using the object-number buffer to identify which object the pixel is in. This allows the fills to be done only once instead of each time a control changes. (In pathological situations, such as a checkerboard of transparent and nontransparent pixels, this could result in quite a large number of object records.)
(Humility, plugins can't modify the behavior of the Paint Bucket or any other tool.)