If you were to import an mesh (such as OBJ) with multiple materials/textures, it will come in as separate meshbuffers because it would need to be drawn in 2 or more separate draw calls.
A material describes the way the polygons are rendered. In the simplest case it might be just 1 color or even a wireframe. A typical case is for example a single texture. But can be several textures, light-setttings or even a shader. Check SMaterial for some of the settings you can use to describe a material.
Still, your mesh could have more than one meshbuffer. For example if you have more than 65k polys and a loader supporting this. Or if your mesh type (and obj does) support groups. These are usually kept in Irrlicht as well, as they might be intended for further use. Say, if you store multiple parts of a mesh in separate groups. Or multiple objects.
Your function has no check for the 16-bit limit. If you have over USHRT_MAX verts your mesh will be corrupted. The index offset of subsequent buffers is also wrong.
Irr does allow 32-bit indices, it's merely the default SMeshBuffer that does not. 16-bit indices should be used because they are faster and save VRAM, this is basic advice that all industry agrees on, and can be found in both AMD and Nvidia guides.
In other words, you are merely discouraged from using 32-bit indices, and indirectly meshes over 65k verts, because using them is against best practices.