So from my ASIC hacking experience + a quick look an the datasheet: instruction decoding, setting multiplexer paths + fetching data from registers or ram can be done in pure unclocked logic. Also modifying the bit. This means, it is possible to read and modify in no time from an SW perspective - it just needs some time to propagate the logic states through the chip. So you simply need a single clock to store back the result which might happen to be the same address as the data was fetched from.
I have programmed not a µC but similar complex logic clouds (like I call this) to not need to use to much clocks in my application. Works very well.
[Edit] Of course you should use as much tricks as possible to shorten the length of the chain of logic functions, so the synthesis tools for chip design can do their magic and everything works as expected. But modern synthesis tool are quite good in that. So if you code your µC or logic function too sloppy, it might not work in the end.
[Edit2] maybe you need a 2nd Clock for fetching the next instruction...
[Edit3] to accompany kruemi's post and extending mine: I am sure you also need one clock at least for the interrupt logic. I don't now if you can parallelise with the store-clock, so maybe here is a another clock you need (you need to have your interrupts evaluated before fetching the next instruction, as it might influence the instruction fetched)...
[Edit4] from an old book of mine, it states e.g. if the bcf command reads from a port, its latched first (another clock!)...
so from all my edits you already have 3-4 clocks needed, but only 1 is needed for what the command really does. the rest is just to do "management"
see https://files.learninginventions.org/Microprocessor%20(261214)/PIC%20Architecture%20Handout.pdf at Page 4
actually they use pipelining to accomplish 1 instruction per cycle at most until a branch is needed.