Each time step that fix_gcmc is called, one of the first things that is done in pre_exchange() is a call to update_gas_atoms_list(). If molecules and regions are being used, this creates a list of all the molecules that have a COM in the defined region. For each MC move (besides insertion), a random molecule is chosen from the created list (which is updated after each move). Therefore, a translation MC move can only happen to a molecule which is on the list, and again to be on the list the COM must be inside the region. So a check of whether a molecule is inside the region is made through the creation of the gas list.
Now that’s how it’s supposed to work, do you have a simplistic input script showing the behavior (infinite loop) that you described in your post?