When you run (get-process | select-object ProcessName,Id,WS -First 1).count
the Select-Object picks the first object from the pipe. Because there's only one object the result is a scalar value, not an array, and scalars don't have a "count" property.
When you place the "@" sigil in front of the parentheses you're coercing the result to be an array. Arrays have a "count" property so you'll get the answer you expected.
In your other example, the $y.entries.values
property is probably a null value. The value "$null" has no "count" property. When you use the "@" sigil you will get an array with a single element whose value is $null. Again, an array has a "count" property.