Try this: use two arms. Driver arm and Bind arm.
The driver arm is a two-section arm that recieves inputs from the IK and FK arms (also two-section arms). Basically it acts normal. The trick is, make sure to set the hand such that its twist channel (rotateX, with default XYZ oriented joints) is last in the rotation order. So in that case, you would use yzx or zyx rotation order. By placing the X rotation at the end of the stack, you ensure that the hand's "twist" is not compounded by the other rotation values on it.
Now, the Bind arm is a duplicate of the Driver arm, except that it has a spare joint part way down the forearm, called 'forearm twist' or such. This joint should have the same orientation as the forearm and hand. The Bind arm is constrained/driven by the Driver arm as usual- with one special case:
HandDriver.rotatey connects out to HandBind.rotatey
HandDriver.rotatez to HandBind.rotatez
HandDriver.rotatex to forearmtwist.rotatex
Do this right, and your forearm twist should "steal" the twist from the hand joint. The model forearm will twist properly, with no added attributes to maintain. You can also use mutliple forearm twist joints instead of just 1; just use a multiplydivide node to ration out the twist among them.
You can also use the same process to add section(s) to the upper arm, or any other joint with twisting problems.