My understanding is that as long as the servlets and ejb beans are running collocated on the same jvm, then you can use the @EJB annotation. However, if the servlets and ejb beans are running on different jvms then you need to use JNDI lookup.
Basically, if your invoking local interface on the ejb I think you can use the @EJB annotation and if you are using the remote interface you have to use the JNDI.
I think that Dependency Injection (in our case @EJB) does not have to do with JVM. The responsible for understanding @EJB annotation is EJB container and servlets do not live in EJB containers, they live in servlets containers. So I do not think you can access your EJB from your servlet via @EJB annotation.
On the other hand, I think Dependency injection can be used with both local and remote interfaces as long as you are in the same EJB container (I know it doesn´t have much sense to have remote interfaces within the same EJB container, but you could do it).
As far as I know, dependency injection is a user friendly abstraction for jndi lookup, available to a select 'managed' classes. And servlet is deemed to be a managed class per Jave EE5. So as you can do a jndi lookup for an EJB from a servlet, you can access it via dependency injection as well(assuming that the container considers the servelet as manged, Jboss-4 does not).