Struts2, c'est comme Struts1 : on ne s'occupe que de la couche de présentation, pas de la couche métier. Or les EJB, c'est exclusivement pour implémenter la couche métier.
Struts1 fournit une servlet unique (ActionServlet) qui est le point d'entrée unique de toute l'application Web, et qui ne fait rien d'autre que déléguer le traitement de la request et la préparation de la response à un objet de type Action. L'objet de type Action est donc, d'une certaine manière, une "sous-servlet" (on préfère parler de "servlet déléguée", mais ça ne change rien dans le fond).
Pour Struts2, le principe reste strictement le même. La seule différence, c'est que la méthode execute() (qui est appelée par la servlet principale de Struts) n'inclut pas les paramètres de type HttpServletRequest et HttpServletResponse. La classe Action doit implémenter ServletRequestAware pour pouvoir récupérer la request. Quant à la response, en fait, on ne la récupère plus jamais dans l'Action : c'est la JSP qui a été configurée dans le struts.xml qui la manipule.
Maintenant, si tu sais accéder à tes EJB depuis une servlet classique, y accéder depuis une classe Action ne devrait pas être difficile : le code que tu plaçais dans la méthode service() de ta classe servlet, il faut juste le mettre dans la méthode execute() de ta classe Action (Struts 1 ou 2, c'est pareil).