You've run into an interesting 'feature' of VBA - the Default Property. Most objects in the Excel Library have a default property, which is used where no property is specified. In the case of the range object the default property is the Value property This means that the line
    Range("A1") = 4
is interpreted by VBA as meaning
  Let Range("A1").Value = 4
In your case, the line 
   a = cells(1,1)
is ultimately interpreted as 
   Let a = range("a1").value
However, had you written  
   Set a = cells(1,1)
then that set forces vba to treat cells(1,1) as an object and thus to set a to act as a pointer to the cell A1, which is what you wanted.
(Had VBA still insisted on using Let for value assignments no confusion would be possible as your original line would have errored for ambiguity - but the Let statement is now optional so you don't get an error if you leave it off)