you actually pointed out one known limitation of OpenGL ES (as opposed to regular desktop OpenGL);
OpenGL ES (in all its flavours, i.e. both 1.1 and 2.0) only accepts index arrays (see glDrawElements function in ImageTargets.cpp) of type "short" or "unsigned short", but does not accept "integers" or "unsigned integers" (see also the use of the GL_UNSIGNED_SHORT constant used in the glDrawElements call);
this limits the total number of vertices (indices) to a maximum of 65534 (i.e. the largest possible unsigned short value);
in regular desktop OpenGL, you could use GL_UNSIGNED_INT and then pass an index array of "integers", with much larger limits (practically no limits), but this is not the case for OpenGL ES (i.e. OpenGL for mobile devices);
since Android and iOS systems rely on OpenGL ES (and so does Vuforia), you are practically limited in the number of vertices, as you also discovered with your experiments;
so, for example, if you had a mesh of around 60,000 indices it would still work (except maybe it would be a bit slow to render), but as soon as you pass the limit of 65K you won't be able to render it anymore (ina single draw call to glDrawElements).
Note, if you are using glDrawArrays instead of glDrawElements, technically you're not using indices, but just vertices; however in practice you will still be limited in the actual number of vertices you can use (in practice the limit should still be around 65K vertices).
A work-around for that (if you really need larger meshes), is to split your mesh into multiple chunks of vertices, and then call glDrawElements or glDrawArrays (and all related code such as glVertexPointer etc.) multiple times, i.e. once for ach chunk of data.
I hope this helps.
more in general