I have a problem with arguments passed as non-evaluated expressions

So, since I've learned about Kernel I was very excited: the idea of explicit evaluation seemed like a very cool idea, giving much more power to the programmer in comparison to the standard "pass evaluated arguments" strategy (1: this statement can be argued upon; 2: there were numerous posts here at LtU and other blogs about potential drawbacks).
Then, I've learned about Io language, which also seems to embrace the idea - when caller sends a message to a target, passed arguments are passed as expressions, not values, giving the full range of custom "control" messages, macros, etc.
This is when it hit me - although the idea sounds very cool, there is something wrong with it. Most likely my mind is stuck in an endless loop of dubious reasoning that I can't get out of, so, hopefully, someone can clarify my concerns.
Let us break down an example, where in some context we have:
 a := Number(1) ;ignore how these two lines are actually executed b := Number(3) ;whats important that the context has two number objects bound to symbols "a" and "b" someAdderPrimitiveObject pleaseDoAddtheseNumbers(a, b) toString print 
so, the caller context asks someAdderPrimitiveObject to add numbers a and b, and the arguments are just passed as "a" and "b" symbols. no problem here, as far as we concerned, because that same "someAdderPrimitive" object can ask the caller to send actual values back.
 someAdderPrimitiveObject pleaseDoAddtheseNumbers := method(x, y, [body, whatever that is]) 
 valx := caller pleaseEvaluateForMe(x) valy := caller pleaseEvaluateForMe(y) [do something with these values, whatever]