You're not "hiding" an order status, you want to show a previous status rather than a current status under certain circumstances. Effectively you want to have a current public status and a current backend status. That's a significant change.
Rather than introducing two separate statuses into a system that is built around having just one, you could more easily solve this issue by having separate language on frontend and backend.
The frontend text for statuses A and B would be the same.
The backend text for statuses A and B would be different.
This assumes that there is a definite link between the two statuses, and that the public always appear to still see status A if it's status B.
For example, if status A is "Preparing pizza", and status B is "Removing all signs of having dropped pizza on floor", this would be fine. But if you sometimes wanted to use status B while displaying status C "Pizza is on the bike", you'd have to split that status too.
As a result, it will definitely be advisable to keep the public status within the backend language, so status B would read "Preparing pizza [Removing all signs of having dropped pizza on floor]".
Another way to approach this would be to find a way of communicating Status B that is appropriate to the customer - eg customer sees "Quality Control", backend sees "Checking for mouse droppings".
If you are fiddling with language, be careful that emails don't send the backend language by mistake.
The non-programming solution is to just have one status frontend and back that is a euphemism for the desired status but appears innocuous to the customer.