Furthermore, if the value at address $55 is 0, as it would be when a program is first run, then after "POKE @BPTRINC, blu", the value of byte 0 in RAM, B0, will be $F0, and the value of bptr will be $56. The value at address $56 will also be zero, so after "POKE @BPTRINC, red", the value of byte 0 will be changed to $A0.
Then you PEEK the value at B0 back into both blu and red, leaving them both at $A0.
You can see this by running your program in the simulator, single stepping, and looking at ram.
(But double indirection is a neat idea--perhaps someone will come up with a use for it--stepping through an array of pointers.)