Spurious Ouputs from Nexperia 74HC154 4 to 16 Decoder/Demultiplexer
You have encountered the well known phenomenon of glitching in multi-bit logic transitions.

Your problem is especially severe, because your Arduino code changes the controlling word one bit at a time, using the very slow digitalWrite() function for each bit in turn.   You could substantially reduce the glitching if you used bits from the same ATmega GPIO port, and wrote them all at once by writing directly to the port register.

However, even changing all the input bits to a logic function at exactly the same time does not mean that the output will change cleanly from one state to another.  For this reason, systems which must avoid spurious outputs rely on synchronous logic whereby the output of a combinatorial function is held in a register, and the time when the inputs change is purposefully separated from the time when the register is clocked to latch a new result, permitting the glitchy transition to complete and settle before "anything looks at" the result.  So adding a register to the output could be a complete solution.

Another option workable in some cases is to use an explicit enable pin to disable all outputs, then change the control word, wait an instant, and re-enable the outputs.  If your application does not require that some output always be active, this can be a simple fix.

Another solution for output demultiplexing is to use something like an I2C I/O expander, where you clock data into the peripheral chip's registers, but the new value only appears on that chip's output pins when the transfer operation is fully completed.