The big problem I ran into while testing this command was the snowball being too fast for
r=1 to work. I believe the time between the snowball entering
r=1 and being destroyed by hitting the entity is not long enough. If you change it to
r=3 it will function. This has the downside of being able to miss an entity by a few blocks and still target it.
Also, to point it out, this will be targeting the snowball in the effect portion of the command. One method I use to determine what is targeted is to use the say command.
Command I used to test your command:
execute @e[type=snowball] ~ ~ ~ execute @e[r=1,type=!Player] ~ ~ ~ say Found
In this case, chat contained several instances of:
[Snowball] Found and did not contain any instances of the entity the snowball hit.
I attempted to tag the snowball to exclude it from the target selector. This allowed radius to be reduced to 2 but 1 still does not function.
To add the tag, I used:
scoreboard players tag @e[type=snowball,tag=!Bullet] add Bullet
With the tag, you can exclude it from the effect portion of the command:
execute @e[tag=Bullet] ~ ~ ~ effect @e[r=2,type=!player,tag=!Bullet] Wither 1 6
Neither is a perfect solution though.
Your target selector syntax was correct, including the multiple arguments.