There are two different methods used for mesh validation in FRawMeshData.
The problem is that they are using very different checks and it is entirely possible to reach situation where IsValid returns true while IsValidOrFixable returns false.
Both subroutines are located within RawMesh.cpp:
The main difference is that IsValidOrFixable requires FaceSmoothingMasks to be present, while IsValid allows that array to be empty. I’m not entirely sure if FaceSmoothingMasks are ALWAYS necessary, and it does not seem to be the case.
IsValidOrFixable is called from within UStaticMesh::Build(), and will result in failure if face smoothing masks are not available.
I’m not 100% certain if that’s how it is supposed to work, which is why I’m reporting it as a bug.