Рекурсивно делай. Опиши требуемую функцию:
def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
    """obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
    ...
Проблема в том, что поля могут быть вложенным. Тогда первым делом составляешь набор нужных тебе полей верхнего уровня:
top_level_fields = {}
for f in fields:
    top, _, bottom = f.partition('.')
    top_level_fields.setdefault(top, [])
    if bottom is not None:
        top_level_fields[top].append(bottom)
Для 
fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
 в top_level_fields получишь 
{ 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}
Дальше перебираешь поля, собираешь их значения в один мешок и смотришь, есть ли для них нижележащие поля:
output = {}
for top, bottom in top_level_fields.items():
    if bottom:
        output[top] = filter_fields(obj[top], bottom)  # что делать, если ключа top нет?
    else:
        output[top] = obj[top]
Таким образом наберёшь всё, что надо.