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)