.obj file? One solution is to introduce duplicate data so that you can address everything with a single index buffer. This may also be faster - despite having more data - because it would allow you to interleave your vertex attributes, rather than using a separate buffer for each. Another solution is to use a second layer of indirection with vertex textures, such that the value for each vertex attrib is a single float used to lookup a vertex texture giving the final value. But in general it can't be done with a pure index-buffer-only solution - you're restricted to a single index buffer per draw call.
So, you're partially on the right track in thinking that a purpose of index buffers is to reduce the number of vertices, but you're totally on the wrong track in thinking that this is the only purpose of index buffers. A second purpose of index buffers is to concatenate multiple primitives into a single draw call. Consider a model that may be composed of multiple triangle strips and triangle fans; without an index buffer you'd need to do a separate draw call for each strip or fan, with one you can handle the entire model in a single draw call.
I touched on an important point there, and that's that memory saving isn't everything. This may seem counter-intuitive, but sometimes it's better to accept extra memory usage in exchange for a faster algorithm. .obj models in particular are misleading, as the format is optimized for storage, not for drawing - it's a lousy format for drawing.