I see the last answer here is 5 years old, but just today I found a way that goes deeper into the object hierarchy without having to deal with strings and splitting. To me it's more like the PoSH way.
(Get-VMHost "MyESXHost").GetClient().config.Server
Here's another way that's less deep in the hierarchy but uses a simple split instead.
(Get-VMHost $ESX).GetClient().ServerUri.Split('@')[1]
On some site I found an example that uses splitting heavier like in the previous answers. I less like this way, especially if it is avoidable, I am for the approach: the simpler, the better, but it works too.
Get-VMHost "MyESXHost" | Select-Object Name,@{N="vCenter";E={$_.Uid.Split('@')[1].Split(':')[0]}}
So, in general, there are three properties (maybe more can be found) that give the same result. :
Uid # need splitting
GetClient().ServerUri # need light splitting
GetClient().config.Server # no splitting, only object properties
I am not going here to looping with ForEach, hope it is not a problem.