Totally agree. I know some people don't like their NAMESPACE or DESCRIPTION to be touched by automated hands, but I find it very valuable.
True, it's not technically an import (i.e. the namespace hoops behind the scenes are a little different), but the practical effect in terms of code management is very much the same as if there were a temporary import mechanism local to a single lexical invocation. IOW, if I wanted such a mechanism, I couldn't imagine a better syntax for it. 
That's a nice proof of concept for localizing the scope, but of course has some drawbacks - to do this with several packages you'd have to use several nested with calls, and the asNamespace function is marked one of the "internal namespace support functions. Not intended to be called directly."
We could use the getNamespace function instead, though, and it looks like it's also relatively simple to (pseudo-)import only a subset of the items in the namespace:
with(mget(c('unit'), getNamespace('grid')),
unit.c(unit(3, "mm")))
# Error in unit.c(unit(3, "mm")) : could not find function "unit.c"
with(mget(c('unit', 'unit.c'), getNamespace('grid')),
unit.c(unit(3, "mm")))
# [1] 3mm
So perhaps this, or something like it, could provide a basis for some code that helps with import management. For multiple packages imported, the lists (results of mget) could even be concatenated, to avoid multiple with calls.
Drawback would still be that RStudio can't easily get the introspection right, since it's done at runtime instead of in a static NAMESPACE file, so it can't tell which names are undefined and warn you with little squiggly lines.