Zoning could help, its the same principle that some object streamers use.
Instead of having all the data in one array, you split it up to divide them into "zones". Then you just need to keep track of the zone the player currently is in, and check only the IDs of that zone.
pawn Code:
// number would be your max number of houses
// instead of
house[number][HOUSE_ENUM];
// you use something like
house[16][number/16][HOUSE_ENUM];
house[0] would then e.g. contain all houses in the top left square of the map (about 400x400 in size), house[1] is the zone right to it, and so on. The global ID of the house could be calculated as zone_id*(number/16)+house_id_in_zone (and the other way round you can get the zone and id from a global id)
Arrays with a dynamic size would make this a lot easier, though they arent available in pawn. So you might need to reassign the ids of some houses due to the "free space" in some zones. If the houses arent distributed equally, the number of houses might also exceed number/16, you would have to increase the total number then, leading to some overhead.
For 500 houses, however, the performance bonus from zoning would be rather small. Pawn is pretty fast with looping and checking simple conditions. So this might just be a solution if youre planning to add even more stuff.
For this relatively small number of things, it might already be enough to optimize your checks, like using squared distances instead of calculating the square root all the time.