Programming with Node's async model makes it extremely powerful and fast to run database queries and file functions in parallel, but the downside is the potential for huge callback spaghetti indeed.
But the callback spaghetti problem can be largely solved by dropping in, for example, the IcedCoffeeScript fork:
There are of course many other async helper solutions as well, and if you're doing serious Node development, it's kind of insane not to use one of these.
If you expect a lot of callback it makes more sense to design that functionality as an object rather than as a single function. That way you can spread callbacks over many functionality and still maintain modularity.
Not necessarily -- the issue is not so much code modularity as much as control-flow issues, which separating out functions (mandatory) doesn't necessarily help with (because of all the flags of what function should call what other function afterwards, etc.).
But the callback spaghetti problem can be largely solved by dropping in, for example, the IcedCoffeeScript fork:
http://maxtaco.github.com/coffee-script/
Or the previous JavaScript TAME functionality:
http://tamejs.org/
There are of course many other async helper solutions as well, and if you're doing serious Node development, it's kind of insane not to use one of these.