Well, that's rude of CPLEX! Maybe someone from IBM can comment on it.
Meanwhile, a workaround that might work (but also might make things worse) would be to change minimize f(x) to minimize z with a constraint z = f(x). In the branch constraint, rather than (or in addition to) passing the new objective bound B as an argument, you could also add a new lower bound B for z (in addition to whatever changes are made when separating the node). That should force CPLEX to use B in gap calculations (unless it finds a bound tighter than B).
It's often not a good idea to add a constraint like f(x) >= B to a problem where you are minimizing f(x), because it causes primal degeneracy/multiple dual solutions (or vice versa? -- still waiting for the morning coffee to kick in). I'm not sure if playing the game of minimizing z and tweaking its lower bound avoids that issue or not, but you could try and see.
#CPLEXOptimizers#DecisionOptimization