The driver doesn’t know how many vertices you are referencing in your drawelements call so it probably scans through the index array on the cpu and only copies the referenced range of indices.
If you use DrawRangeElements you provide the range implicitly and you should get better performance. For best performance use the ARB_vertex_buffer_object extension, or display lists.
No, if you have 500 vertices in your array, but reference only 250 in the indices, only those 250 are transformed.
The glVertexPointer alone doesn’t tell OpenGL how many vertices are behind the pointer.