Thanks for the suggestions. Redstone Ore sets the tick rate differently than my Block B. Block B also checks if a player is standing on it before changing back into Block A. It seems to be successfully checking for the player, so that leads me to believe that the problem might be the tick rate.
Redstone Ore's tick rate is too slow for this block since it takes a minute or two to change instead of a few seconds. This is the Redstone Ore tick rate:
I used this and changed the return to a variety of numbers between 1 and 100, but no change seemed to make a difference in how long they took to change back to Block A. What am I missing about changing this value? For example, this is the updated code using the Redstone Ore tickRate instead of the scheduled updates in the original code:
I don't understand why the tick rate would change whether or not the client gets the setBlockState change even though the server does. If it isn't a problem with the tick rate, is it a problem with setBlockState?
There are plenty of examples of blocks being walked on (and Block A is using onEntityWalk to turn into Block B), but not many (any?) that detect not being walked on. Lit Redstone Ore doesn't actually detect if you stopped being on it or not, it invariably resets itself to off after a minute or two. I tested that by making a small enclosed space with a Redstone Ore block in the middle of the floor, stood on it, and waited. Eventually the light flickered for a split second, and again every minute or two. It doesn't actually check if you're there, just turns itself off and then the unlit ore turns back into the lit ore almost instantly. So that's why I'm checking if the player is there first or else it flickers between blocks a lot since I want it to change much faster than Redstone Ore.