As far as I understand it (and please correct me if I'm wrong), the inverse bind pose matrices convert from object space to each joint's space (and they don't need to be updated every time an animation is interpolated). The inverse bind pose matrices also don't need to be transformed by their parent's inverse bind pose (i.e. are not hierarchical).
The first sentence is true, but the second might depend on format. I've worked with md5 meshes and for them bind pose matrices are always stored so that no multiplication by parents is required. I'm not sure if this holds for all formats, but I don't see any reason why they should be stored the other way.
For every frame, once I have each joint's position / rotation interpolated from animation data, I go over ever vertex's weights. For each weight I transform the original vertex by the inverse bind pose matrix (to go to joint space), then by the joint's hierarchical transform (local + parent) then by the scalar weight, and the final vertex position is the sum over all weights. Is that all or am I missing something?
Sounds about right, although there is a choice here. What you describe is suitable for GPU skinning, as you can compute poseMatrix*inverseBindPose and put these as uniforms to be used in a shader, where the vertices are then transformed. Another choice would be to transform the vertices into bone space by multiplication by the inverse bind pose matrix as a pre-computation. Then the pre-transformed vertices only need to be multiplied by the animation transform during rendering. This is cannot be implemented on GPU in a sensible way.
Another question I have is whether the inverse bind pose matrices are mesh-specific or skeleton-specific. Let's say I'm using a single skeleton and animation set to animate two different meshes (character A and character B, for example). Would the inverse bind pose matrices be the same or are they different for each mesh? Either case, why?
I would think that the bind pose matrices and (their inverses) are only skeleton specific and can be applied to multiple meshes using the same skeleton.