I don't understand the problem. What I am saying is this:
IF you have a function that follows this pattern:
  It has a new assumeUnique argument.
  The ONLY thing that it does with that argument is pass it to .setAssumeUnique(assumeUnique) on a constraint or index object before returning that object to the caller.
THEN you can make the code simpler by taking away that argument and instead of passing a variable to the argument in the caller, passing that argument to .setAssumeUnique(assumeUnique) in the caller -- or don't even do that if passing false for assumeUnique.
SO fewer functions need to have a separate assumeUnique argument.

This may have a ripple effect as the caller may now be a function that only passes assumeUnique to setAssumeUnique and then returns the object -- so maybe now IT can be simplified, too.

I don't understand how this simple change adds overrides anywhere -- I think it just reverts a few functions to their old signatures / their old implementations. assumeUnique only needs to default to false at the very bottom of the call stack (the constraint or index object member) and only needs to be considered at the top of the call stack in the first functions that have access to the desired non-default assumeUnique near the start and have access to the constraint or index object near the end.

If this seems risky to you, we can put it off until I get my innovation week time.