I know this is an older post I found it yesterday and had the same problem as you. Izk222 already bypassed the issue with a different technique but for this specific script:
The issue is that you need to run the same 'for loop' for web maps as you do the web apps. "matches" only contains a string of id numbers for the maps. It doesn't have a title, id, or type. Running the loop captures that data to send to the pandas data frame.
 
 
From the top for catching apps and web maps:
from arcgis.gis import GIS
import pandas as pd
# Log in to portal; prompts for PW automatically
gis = GIS('your portal url including https', 'your username')
# Layer ID to search for and its URL
find_id = 'layer id number'
find_url = gis.content.get(find_id).url
print(find_url)
# Pull list of all web maps in portal
webmaps = gis.content.search('', item_type='Web Map', max_items=-1)
# Return subset of map IDs which contain the service URL we're looking for
m_matches = [m.id for m in webmaps if str(m.get_data()).find(find_url) > -1]
# print web map ids that use this layer for sanity check
for i in m_matches:
    print(i)
# create list to store target maps
map_list = []
for w in webmaps: # for every map in your portal
    
    try:
        # Get the JSON as a string
        wdata = str(w.get_data())
        criteria = [
            wdata.find(find_url) > -1, # Check if URL is directly referenced
            any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app
        ]
        # If layer is referenced directly or indirectly, append app to list
        if any(criteria):
            map_list.append(w)
    
    # Some apps don't have data, so we'll just skip them if they throw a TypeError
    except:
        continue
# Pull list of all web apps in portal
webapps = gis.content.search('', item_type='Application', max_items=-1)
app_matches = [a.id for a in webapps if str(a.get_data()).find(find_url) > -1]
# print web app ids that use this layer for sanity check
for i in app_matches:
    print(i)
# Create empty list to populate with results
app_list = []
# Check each web app for matches
for w in webapps:
    
    try:
        # Get the JSON as a string
        wdata = str(w.get_data())
        criteria = [
            wdata.find(find_url) > -1, # Check if URL is directly referenced
            any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app
        ]
        # If layer is referenced directly or indirectly, append app to list
        if any(criteria):
            app_list.append(w)
    
    # Some apps don't have data, so we'll just skip them if they throw a TypeError
    except:
        continue
# display data
print('apps:')
pd.DataFrame([{'title':a.title, 'id':a.id, 'type':a.type} for a in app_list])
# display data
print('web maps:')
pd.DataFrame([{'title':m.title, 'id':m.id, 'type':m.type} for m in map_list])