Sure, call sites of C will need to change, since C's signature changed. That's expected, since C doesn't even take a callback anymore. But callers of A,B,D,E etc don't need to change. A,B,D,E etc can still take a callback parameter and return C's result via the callback.
MultiplyAndSquare = (a, b, cb) ->
Multiply a, b, (err, product) ->
Square product, (err, square) ->
cb(null, square) #ignore errors for now.
C = (a, b, cb) ->
MultiplyAndSquare(a, b, cb)
ABDEXY = (a, b, cb) ->
#Calls C
C(a, b, cb)
callersOfABDEXY = (a, b) ->
#Calls ABDEXY
ABDEXY a, b, (err, result) ->
Console.WriteLine(result)
#Refactored C. Returns a promise instead.
refactoredC = (a, b) ->
(Q.async ->
result = yield Q.nfcall(MultiplyAndSquare, a, b)
return result)()
#Refactored ABDEXY.
refactoredABDEXY = (a, b, cb) ->
#Change needed here, since C now returns a promise
refactoredC(a, b).then (result) ->
cb(null, result)
#No need to refactor callersOfABDEXY