I’ve done quite a bit of Zwift racing and I’d agree that you probably won’t get optimal VO2 training from it.
Looking back at my most recent races, I usually spend about 25% of the race duration at VO2 or above. For a 20min race, that’s only 5mins (barely a VO2 workout). For a 1hr race, thats 15mins (not even equivalent to a 5x4min). Also, as you are racing, you generally won’t HOLD the VO2 power for any reasonable duration - you just spike up to it for 30sec to a couple of minutes at a time.
In general, my races are just as others have characterised - constant threshold/upper tempo effort with spikes into VO2. However, this will also depend on where you sit within your grade:
If you are at the bottom end of your grade, it will be VO2 until you get dropped, then probably only tempo.
If you are in the middle of the grade, it will likely be threshold for the full race with only a few VO2 (otherwise, you’ll get dropped).
If you are at the top of the grade, you’ll be riding upper tempo/threshold, throwing in attacks at VO2. This is probably your best chance of getting a proper VO2 workout, as you are in a bit more control of the duration of your VO2 efforts, however, you’re still in a race so can’t spend as long at VO2 as you could doing longer VO2 efforts in isolation.
Having said that, I do enjoy the races… If I were looking to substitute them for TR workouts though, I’d substitute them for straight up Threshold workouts or Over-Unders.
Finally, keep in mind the potential problem being that you can overdo it and not be able to recover properly for your next session… This is part of the reason the TR trainers seem to advocate Sweet Spot instead of Threshold work, as it provides most of the same benefits, but does not jeapordise being able to still do high level work the next session.