Iterate over CollectionProperty with blendfile.py
blendfile.py actually supports getting elements of a collection property with some super neat and simple API!

    for blend_file_path in blends:
        with blendfile.open_blend(blend_file_path) as blend:
            scenes = [block for block in blend.blocks if block.code == b'SC']

            for scene in scenes:
                # get custom properties
                properties = scene.get_pointer((b'id', b'properties'))

                if properties is None:
                    continue

                # iterate through all the property groups
                itor = properties.get_pointer((b'data', b'group', b'first'))
                while itor is not None:
                    if itor.get(b'name') == "ms_lightmap_groups":
                        length = itor.get(b'len')

                        for i in range(0, length):
                            group = itor.get_pointer((b'data', b'pointer'))

                            if group is not None:
                                # iterate over all the properties
                                # (!) i specifies the index in the collection
                                prop = group.get_pointer((b'data', b'group', b'first'), base_index=i)  
                                while prop is not None:
                                    name = prop.get(b'name')

                                    if name == 'name':
                                        offset = prop.get((b'data', b'pointer'))
                                        length = prop.get(b'len')
                                        blk = blend.block_from_offset.get(offset)
                                        blend.handle.seek(blk.file_offset, os.SEEK_SET)
                                        atlas_name = blendfile.DNA_IO.read_string0(blend.handle, length)
                                    elif name == 'resolutionX':
                                        resX = prop.get((b'data', b'val'))
                                    elif name == 'resolutionY':
                                        resY = prop.get((b'data', b'val'))

                                    prop = prop.get(b'next')

                                atlases[atlas_name] = (2**(resX+8), 2**(resY+8))
                                print("Found atlas %s" % atlas_name)

                    properties_itor = properties_itor.get_pointer(b'next')


BlendFileBlock.get(...) and BlendFileBlock.get_pointer(...) both have an optional base_index parameter which is gets you exactly this.

May this be of use to someone else out there :)

Happy blending! :D