We already have code for this, see VARIANT_NumberFromBstr(). The difference is that we don't want particular output type, instead using what VarNumFromParseNum() produced.
This needs more tests for every function you change. We can start with more tests for VarAnd() to trigger different numeric types, to confirm that we can actually use VarNumFromParseNum().