I don't see the update in the post. If you pass the version in an UPDATE statement it will get overridden by the trigger.
NEW.version := OLD.version + 1;
NEW.version := OLD.version + 1;
Is there a different concurrency issue I'm not seeing caused by updating the version in the trigger?
You still have the issue of someone setting the version explicitly in an update statement without a WHERE clause which checks for the current version. But I guess as long as you enforce not doing that it's fine.