Great post smies

We have actually deprecated ZmCsfeAsynchCommand and modified the ZmCsfeCommand.prototype.invoke method to also support asynchronous calls (basically there is a callback parameter that if populated will result in the call being asynchronous). Among other things, we have also added the ability to cancel outstanding requests so that it is possible to allow the user to cancel operations if so desired.
As Kevin mentioned, we have made a first pass at moving all of our network calls to using the asynchronous model (there are a few we have not gotten to, and couple we cannot convert because of some interesting interactions with the browser). We have just about completed the work and will probably do another pass at flattening the codes callback structure in the near future.
We first used the synchronous model, because a couple of years ago when we were new to AJAX and trying to code the client, we first discovered the synchronous model and it was most expedient to just use it (since we were dealing with lots of other variables at the time). We have been badly wanting to convert for the longest time, but because of product requirements and release schedules, we have just not been able to get to it (and it is one of those things that the longer you wait the more painful it becomes to convert!

)
My advice to you is to use the asynchronous model unless it makes no sense for your particular application. However, be aware that it can make your code more complex. You will by nature have to deal with callbacks which can be quite inconvenient and disruptive to the call flow since you basically lose the call stack and may have to cart state around - again this can be minimized if you start out with the async model in mind. For example, consider using a notification mechanism (such as the one provided in the AjaxTk) to indicate when operations are completed. For example, if you are using MVC, then a model would notify all interested listeners, such as controllers, that a modification has occurred to its state.
If you are careful, it should be possible to keep your callback depth to a couple levels in most cases. Also remember that if your app permits, it is possible to have multiple outstanding requests which may complete out of order, so your code should be robust enough to handle such a scenario. Also, you need to be aware of when to block the UI to prevent user interaction and when to allow the user to continue using the UI despite the fact that multiple operations may be executing in the background.
I am sure there are other issues, they just don't come to mind right now

But good luck with your application!