The A* search seems to recalculate the f-value for Arad, Sibiu and other repeated states, which it shouldn't be doing since these nodes have already been expanded and are in the closed state. So what am I missing here? (Image from Russel and Norvig - Artificial Intelligence.
In this case, these nodes aren't expanded since their f-values are more than the optimal path, what if that wasn't the case? i.e. what if the nearest f-value was to go back to the predecessor node? Would the A* do that?

Most A* algorithms backtrack, which means that a node can only be visited once. Otherwise the chain of back-pointers is broken and the path cannot be recovered. However you could concievably have a situation whereby a node lower down in the priority queue can access an visited node with lower cost, if diagonal moves are more expensive than square moves. Normally you'd ignore that and treat the visited node as unvisitable - unless you're using a weird and wonderful heuristic or have a very odd graph, it's hardly going to make a difference to path length.