When constructing a MTLIndirectAccelerationStructureInstanceDescriptor, one specifies an accelerationStructureID. In the equivalents in both Vulkan and DirectX12, one can set it to zero to be an "inactive" instance. However, on Metal, this field does not appear to have any documentation, and thus it is difficult to figure out if there is similar behavior (and no other Metal documentation seems to mention this). Does setting this field to 0 (i.e. null) disable the instance? If not, is there any other way to have an equivalent effect?
The documented way to make an instance inactive is the mask field, which MTLIndirectAccelerationStructureInstanceDescriptor (https://developer.apple.com/documentation/metal/mtlindirectaccelerationstructureinstancedescriptor) already carries. Its declaration in MTLAccelerationStructure.h describes it as "Instance mask used to ignore geometry during ray tracing".
The semantics are in the Metal Shading Language Specification (https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf), in Table 6.29, Intersect function input parameters. That table describes the mask parameter as the "Intersection mask to be AND'd with instance mask defined in the Metal API". It also states that "Instances with nonoverlapping masks are skipped". An instance mask of zero cannot overlap any ray mask, so an instance with a zero mask is skipped for every ray. The specification names MTLAccelerationStructureInstanceDescriptor in that sentence, and that is the same mask field the indirect descriptor carries.
Your reading of accelerationStructureID is correct. It is documented only as the "Acceleration structure resource handle to use for this instance", and MTLResourceID is an opaque structure whose single member is private. Nothing documents a zero, null, or reserved handle value, so there is no documented behavior to build on.
For a GPU-driven build this costs you nothing extra. Zeroing mask is a single 32-bit store into a descriptor your shader is already writing.