OK, this will fix it for the ICZ ice blocks.
Look for:
loc_8B3D2:
bset #2,$2A(a1)
move.b #$E,$1E(a1)
move.b #7,$1F(a1)
move.b #2,$20(a1)
move.w #-$300,$1A(a1)
bset #1,$2A(a1)
bclr #3,$2A(a1)
move.b #2,5(a1)
btst #4,$2A(a0)
beq.s loc_8B41A
lea (Player_2).w,a1
bset #1,$2A(a1)
bclr #3,$2A(a1)
Now add some stuff in the middle so it looks like this:
loc_8B3D2:
bset #2,$2A(a1)
move.b #$E,$1E(a1)
move.b #7,$1F(a1)
move.b #2,$20(a1)
move.w #-$300,$1A(a1)
bset #1,$2A(a1)
bclr #3,$2A(a1)
move.b #2,5(a1)
btst #3,$2A(a0) ;
beq.s + ;
lea (Player_1).w,a1 ;
bset #1,$2A(a1) ;
bclr #3,$2A(a1) ;
+ ;
btst #4,$2A(a0)
beq.s loc_8B41A
lea (Player_2).w,a1
bset #1,$2A(a1)
bclr #3,$2A(a1)
I.e. add the section with the semicolon comment markers on the right. Adding comments is left as an exercise for the reader. (Because I'm lazy.)
But in essence: this whole section is run when the ice block is destroyed, and a1 will have been loaded by the previous section with a pointer to the object RAM of the player who destroyed it. It clears any status of that player standing on an object and bounces them up a bit, amongst other things. Then the bit at the bottom, under where I added the fix, goes "Hey, by the way, was player 2 also standing on this object? Let's drop him off it if so." But it never makes any explicit check for whether player 1 is standing on the object, and as such it never drops him if player 2 broke the block.
I suck at explaining this stuff, and that's one of many reasons you don't see any guides by me! But I hope that makes some sense and someone can translate it into something meaningful. If anyone wants to suggest some more objects where similar stuff occurs I can look into those too, but as ever, I make no promises as to when that may be.
You will probably also have to look a few lines up and change a beq.s locret_8B430 to a beq.w. Such is life.