In the Hole lies outside shell and arcpy thread, the OP had geometries that were invalid but Esri tools were failing to detect them as such. After some investigation, I discovered a shared-origin edge case where the Check Geometry will fail to detect an invalid geometry.
The following is a simplified example of the OP's geometries from the Hole lies outside shell and arcpy thread.

In the example above, polygon a is valid while polygon b is invalid because of "hole" lies outside of the bounding geometry. When run through Check Geometry, it will identify polygon b as invalid. When the two parts are combined into a two-part multi-polygon, the Check Geometry tools fails to identify the polygon as invalid even though one of the two parts is invalid.
The following code creates a feature class containing three polygons (a, b, and ab), and then checks the geometry of all three:
<SPAN class="keyword token">import</SPAN> arcpy
SR <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>SpatialReference<SPAN class="punctuation token">(</SPAN><SPAN class="number token">4326</SPAN><SPAN class="punctuation token">)</SPAN>
polys <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="string token">"a"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"MULTIPOLYGON(((10 5, 10 10, 0 10, 0 0, 10 0, 10 5)))"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"b"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"MULTIPOLYGON(((10 5, 15 0, 20 5, 15 10, 10 5),(10 5, 7.5 2.5, 5 5, 7.5 7.5, 10 5)))"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"ab"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"MULTIPOLYGON(((10 5, 10 10, 0 10, 0 0, 10 0, 10 5)),"</SPAN>
<SPAN class="string token">"((10 5, 15 0, 20 5, 15 10, 10 5),(10 5, 7.5 2.5, 5 5, 7.5 7.5, 10 5)))"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">}</SPAN>
fc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CopyFeatures_management<SPAN class="punctuation token">(</SPAN>
<SPAN class="punctuation token">[</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>FromWKT<SPAN class="punctuation token">(</SPAN>polys<SPAN class="punctuation token">[</SPAN>p<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> SR<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> p <SPAN class="keyword token">in</SPAN> polys<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CreateScratchName<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="operator token">=</SPAN><SPAN class="string token">"memory"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">)</SPAN>
chkGeom <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CheckGeometry_management<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CreateScratchName<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="operator token">=</SPAN><SPAN class="string token">"memory"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>chkGeom<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"FEATURE_ID"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"PROBLEM"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> sep<SPAN class="operator token">=</SPAN><SPAN class="string token">"\n"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>The result is that just one of the three polygons is identified as invalid:
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>chkGeom<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"FEATURE_ID"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"PROBLEM"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> sep<SPAN class="operator token">=</SPAN><SPAN class="string token">"\n"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'incorrect ring ordering'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Since the third polygon is a combined polygon, it should also be identified as invalid.