I think I found root cause for my issue. Though the read-only beans do not get locked into transactions, invocation lock still exists. In other words, only one thread can access a bean instance at a time.
But, does this still cause transaction dead-locks? If it does, what's the purpose of configuring read-only beans? Please correct me if I am wrong. Any of your suggestions are greatly appreciated.