Olá, Bruna! Acredito que seja possível, sim, criar uma função para fazer o set_crs de uma vez. Para finalizar o seu código você pode criar uma função que recebe uma lista de GeoDataFrames e a string do CRS que você deseja definir para cada um deles. Aqui está um exemplo:
def set_crs_all(shapes, crs):
for shape in shapes:
shape.set_crs(crs, inplace=True)
# Definindo a lista de GeoDataFrames
shapes = [metro_sp, cultural_sp]
# Definindo a string do CRS
crs = '+proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=km +no_defs'
# Chamando a função
set_crs_all(shapes, crs)
Lembre-se de que essa solução pode não funcionar em todos os casos, especialmente se os GeoDataFrames em sua lista tiverem CRS diferentes uns dos outros. Mas para o seu caso específico, acredito que isso possa funcionar.
Espero ter ajudado e bons estudos!