How does the program decide what indices to assign to vertices?
- new vertexes are appended to the end of the vertex list
- duplicating vertexes adds them also to the end and their order is maintained
- .. list too long..
It would be very time consuming to analyze every mesh operation/modifier and how it handles vertex indices and make a list for you (it will be like the above though in most cases if not in all). Instead you can reverse engineer this yourself:
bpy.app.debug = True into the Python Console
This will enable super top secret mode with next option available in Properties panel:
Now you can see the indices and how they change for what you are interested in:
Can anything be done to control which get re-assigned?
Nope, blender handles it internally.
Are there any ways to recalculate, re-assign, or copy vertex indices?
Sure, with python you can do anything to meshes, you can reorder the vertices. Just by building a new mesh with different vertex order from old one and then switching them.