Not the answer you should accept, but providing some background on performance:
from random import randint
from timeit import timeit
# generating 1,000 dictionaries of random keys with random string values
dicts = [{k: str(randint(1, 10000)) for k in range(10000)} for _ in range(1000)]
def all_max1():
# the answer provided by @MarkMeyer
return [max(d.values(), key=int) for d in dicts]
def all_max2():
# the answer provided by @Marceline
return [max(int(x) for x in d.values()) for d in dicts]
print(timeit(all_max1, number=10))
print(timeit(all_max2, number=10))
The answer @MarkMeyer provided is almost twice as fast as the answer provided by @Marceline, though both are technically correct.
Result:
7.4847795
11.341150599999999
The advice of @JHeron is good advice in that if you can avoid having strings in that position in the first place, using integers would be more efficient - but I assume your data comes in the form of strings.
However, if you need to operate on those values more than once (for more than just a single max value), you may consider first converting the original data and avoid multiple conversions later.