obj1 = {
    'ZZZ': {
        'A': [100, 200, 300],
        'B': [400],
        'C': [500]
    },
    'YYY': {
        'A': [100],
        'B': [200, 300, 400],
        'C': [500]
    },
    'XXX': {
        'A': [100],
        'B': [200, 300],
        'C': [400, 500]
    }
}

obj2 = {
    '100': {
        'A': ['ZZZ', 'YYY', 'XXX'],
        'B': [],
        'C': [],
    },
    '200': {
        'A': ['ZZZ'],
        'B': ['YYY', 'XXX'],
        'C': [],
    },
    '300': {
        'A': ['ZZZ'],
        'B': ['YYY', 'XXX'],
        'C': [],
    },
    '400': {
        'A': [],
        'B': ['ZZZ', 'YYY'],
        'C': ['XXX'],
    },
    '500': {
        'A': [],
        'B': [],
        'C': ['ZZZ', 'YYY', 'XXX'],
    },
}

result = {}
letters_cache = set()
# iterate over first layer (XXX, YYY, ZZZ)
for group, letters in obj1.iteritems():
    # iterate over second layer (A, B, C)
    for letter, numbers in letters.iteritems():
        # iterate over numbers
        letters_cache.add(letter)
        for num in numbers:
            str_num = str(num)
            # set up number as top level key
            result[str_num] = result.get(str_num, {})
            # set up letter as second level key
            result[str_num][letter] = result[str_num].get(letter, [])
            # set append group name
            result[str_num][letter].append(group)

# append missed letter to result
for number, letter_group in result.iteritems():
    for letter in letters_cache:
        if letter not in letter_group:
            letter_group[letter] = []

print(result)