Vec::pop_if pops the last element of the vector if the predicate is true, not the last element where the predicate is true. Your last element is A { dd: 4 }, it does not match |x| x.dd == 3, so it is not popped.
"pop" always means removing the last (or first, depending on the data structure) element, and it implies O(small), and "the most easily accessible element" – it's a ubiquitous term in computing.
Nobody uses "pop" for "remove an arbitrary element in linear time".