Okay, so "VML" is a calculated property. I gotcha now. Seems overly complex, but I can roll with it.
Here's the thing, since that's not a standard property, you need to provide that context in order to use it:
If you plan on reusing that property, you should save it into an array:
$myvml = "01000300003431373861313338313438323331373136633963653930303430636430336264536572766572"
$VMLObjs = $esx.ExtensionData.Config.StorageDevice.ScsiLun | Select-Object @{N="ESX";E={$esx.Name}}, CanonicalName, @{N="VML";E={$_.Descriptor | where {$_.Id -match "^vml"} | Select -ExpandProperty Id}}
$VMLObjs | Where-Object {$_.VML -match $myvml }
If you don't plan on reusing your calculated VML property, then you can just pipe it into Where-Object:
$esx.ExtensionData.Config.StorageDevice.ScsiLun | Select-Object @{N="ESX";E={$esx.Name}}, CanonicalName, @{N="VML";E={$_.Descriptor | where {$_.Id -match "^vml"} | Select -ExpandProperty Id}} | Where-Object {$_.VML -match $myvml }
If you don't want the hassle of a calculated property, you can just match $myvml to the Uuid property, as suggested above. Whatever works for ya.