Merging nested structures like this can be a bit cumbersome right now, but I think here is something that can hopefully get you moving:
value = { for k, _ in merge(local.oauth_merge_permissions...) :
k => merge([for obj in local.oauth_merge_permissions :
obj[(k)] if lookup(obj, (k), null) != null]...)
}
What this does is merge once to collect the top level key names, but since merge is not recursive, the values are not going to be correct. Once we have the key names though, we use those to filter the original list and merge the nested objects.