You're close, but you're not starting the process with Start-Job, so Get-Job and Wait-Job don't do any good. Would this work?
$commands = @()
$commands += "notepad.exe"
$commands += "notepad.exe"
$commands += "notepad.exe"
$commands += "notepad.exe"
foreach ($instance in $commands)
{
While ( (Get-Job -State Running).Count -ge 2 )
{ Start-Sleep -s 5 }
Start-Job -ScriptBlock {Start-Process -FilePath $args[0]} -ArgumentList $instance
}