You can do this by using a field in your layer's attribute table as the source for the buffer distance, rather than specifying the distance manually. This works in either the Buffer Wizard or the Buffer geoprocessing tool. You would first need to create a field in your feature class, then populate it with the buffer distances you'd like to use for each feature.
The new field (I usually call it "BUFF_DIST") can either be numeric or text. If you use a text field, you can specify the distance and units of the buffer you'd like to use, that's the most foolproof way to do it. In your example, you'd add
500 meters as the BUFF_DIST value for a city with an area of 50km2. It sounds like you're saying the buffer distance would be proportional to the city area, so your Field Calculator expression (in Python) would be something like
str((!CityArea! * 0.01)) + " meters".
If you use a numeric field for the buffer distance, you can specify the units later if you use the Buffer Wizard:
If you use the geoprocessing tool, you can use a numeric field as the buffer distance but the tool will assume that the units are the same as the units of whatever coordinate system your feature class uses. You're better off storing the buffer distances in a text field as I described, there's no way to specify the units during the operation if you want to use units other than whatever CS your layer is in: