My family cheats at this. We keep wishlists of "items we know we need but can't justify purchasing yet". Then we exchange lists and pick things/a thing to gift. The trick here is you're no longer trying to "justify" the purchase to yourself and you get something you actually need/want instead of something they thought you needed/wanted. It also means you don't need to think hard about what to get.
We've found we appreciate the gifts more because they are something we know with certainty that we'll use. There is still room to "surprise" with what is picked from the list. And in addition, you can pick similar items to items on the list to still throw that bit of "I thought you'd appreciate this too" in there.