В c# же так же есть асинхронные методы...
В node.js почти все асинхронное, так что обычно передаются два коллбэка, для вызова в случае успеха и передачи туда результата, либо вызов обработчика ошибок. Что бы код не превратился в мессиво из вложенных колбэков, читайте про Promises.
https://github.com/kriskowal/q - советую воспользоваться. К слову там в документациях пример и с использованием коэбеков, и показывающий почему лучше юзать Q. В этом случае метод .then, предоставляемый вам промисом, будет являться аналогом ключевого слова await в c#.