The variables inside your foreach are not doing what you think they're doing.
You defined $VMList as a list of virtual machines at the beginning.
In line 4, $VMName is not the name of the currently foreach'd VM, but every single item in the "Name" column of your CSV. That doesn't break lines 7-10 because all of those will accept an array of names. Basically, you are running lines 7-10 for every single virtual machine on every pass of the foreach.
Your changed line breaks because the Count parameter of Set-VMProcessor will not accept a list of numbers. $VMList.NewCPU represents a list of every single item in the "NewCPU" column of your CSV. That's what the 'System.Object[]' part of the error is trying to tell you.
To reference the current item in a foreach loop, use $_. So, line 4 becomes:
$VMName = $_.Name
and your updated line becomes:
$CPUCount = $_.NewCPU
Edited to add:
Also, your foreach does not have an input object, so it doesn't know what to foreach over. You can write the foreach line like this:
ForEach-Object -InputObject $VMList -Process {
Personally, I don't find the $_ syntax particularly legible and prefer to use the language construct foreach instead of the cmdlet. That would look something like:
foreach ($VM in $VMList)
{
Stop-VM $VM.Name
...
Start-VM $VM.Name
}