Use two-part encounters: opponents that the armour is effective against, plus opponents that care less about the armour.
For example, a necromancer who has a host of skeletons raised will challenge a group in different ways. The skeletons will be fun to smash through with impunity, "challenging" the armour and giving them the satisfaction of seeing it do its job. The necromancer will be using spells that challenge the party's saving throws, giving them a real problem that they can't just ignore behind a wall of armour.
The trick is to find the CR of the "mob" creatures and the CR of the "real challenge" creature that will actually be fun without being overwhelming. The skeletons in the example won't be much of a challenge, but spells can tip the balance and make a character suddenly vulnerable. Similarly, the necromancer in the example can't be high enough CR to challenge the party all by themselves since the skeletons will be absorbing attacks and constraining the PCs movements.
It can make for a very swingy fight, so start small and pitch the CR of the two parts low. Don't be bothered if one or the other part gets taken out quickly – the players will enjoy the halfway success and they should reap the benefit of making the other opponent easier by taking out their support. Getting a feel for this kind of encounter will take some time, because it's outside of the "level-appropriate encounter" design paradigm. Besides, the first time the players get into this kind of encounter they're likely to underestimate the challenge. They will notice even a weak challenge that can get around their armour, and they won't underestimate that next time.
The important thing is to keep challenging the armour. The players have spoken, and they want to see things smash to bits against their superior defenses. If that's all you had happen it would get boring fast, but it will remain satisfying for a long time if they can enjoy that smashing as a background to other, still-challenging action.