It turns out the virtual store is being used up by a trigger.
There's a nice explanation here: https://www.itprotoday.com/sql-server/triggers-and-version-store
My other mystery is why the virtual store space isn't necessarily freed up once the update/insert/delete has completed and a minute has passed for the system cleanup to run. It has to do with some other long-running transaction(s) but, as far as I know, they're not accessing the database with the trigger.
I've noticed this also with the virtual store and a database with READ_COMMITTED_SNAPSHOT where the space won't be freed up until some long-running transactions complete (again, I don't think they're accessing the database with the READ_COMMITTED_SNAPSHOT setting).