The portal configuration has subscription_update.proration_behavior and the default is create_prorations, which is exactly the credit you are seeing. Set it to none and the switch takes effect immediately with no money moving.
Better shape, if you have twenty minutes: keep prorations for upgrades (people like getting charged less to move up) and handle downgrades yourself with a subscription schedule that flips the price at current_period_end. They keep plan A until the date on the receipt they already paid, then land on B. Nothing to credit, nothing to explain.
Also worth knowing that portal configurations are objects, not one global setting. You can allowlist which prices are switchable and hand different customers different configurations.