Is it safe to assume that you're using MS Exchange, and that what you really want to change is the contact's external email address? If so, why not use the Get-MailContact (using the -Filter parameter) and pipe the result to Set-MailContact? Use the -ExternalEmailAddress parameter to do this and you'll change all the right properties (not just the primary SMTP proxy address).
If you choose to use your current script, the ProxyAddresses property is a collection of addresses. I believe you need to modify the existing set of addresses and then replace them as a whole array.