First the VM can't know what the actual RAM usage of the VM is, because it is isolated from the host. It can only calculate with the RAM it can see and that isn't all RAM the VM is using. You always get virtualization overhead. The KVM process running the VM itselfs needs RAM, writeback caching needs RAM and so on. All the VMs OS is seeing is virtual RAM, not real physical RAM. So no matter what a guest is reporting, its never the real RAM usage.
And then there is the question what you call free or used RAM. See
https://linuxatemyram.com for an example.
Referring to that example, the guest agent in a Win VM will report "available" as free RAM. The guest agent in a Linux VM will report "free" RAM as free RAM.
So Win VMs are just wrong from the viewpoint of the hypervisor which only cares how much physical RAM is either free or used. It won't care how the used RAM is used. RAM used by the guest for caching is as bad as RAM used by processes, as the host can't directly drop caches of a guest. So for the PVE host it isn't useful to know how much RAM is "available".
And then there is the problem that freeing up virtual RAM in a VM doesn't mean that this will also free up physical RAM. Thats what I tried to explain, that the KVM process still reverves the physical RAM and won't free it, even if that virtual RAM isn't in use by the guest OS anymore.
I also would like to hear why the KVM process isn't freeing up physical RAM after that virtual RAM is free again. Atlest this is the behavior that I'm observing for all kinds of VMs since PVE 6.X till now. No VM, neither Linux, Win or FreeBSD ever gave RAM back to the host witout restarting the VM or using ballooning.
Maybe someone of the staff can explain it.