Because the first thing you do is notify Washer motion, every time it is triggered. But it's never getting past what you described above as "Exit if inactive", I guess. You don't need that. It sounds like you just want to wait 5 minutes at first, when the washer first starts, and then wait until it stops moving for 3 minutes, and that means it's done, right?
Then put the delay in the IF-THEN described above, after IF-THEN Private Boolean true. That way, it only does the delay the first time the rule runs. After the END-IF comes the Wait for Event. Every time the rule is re-triggered the Wait will be cancelled, but only the notification and delay will happen the first time, when it first starts up. However, if the washer stops for 3 full minutes, the rule is going to interpret that as the washer being done. If that's not a desirable outcome, it will become more complicated (see below). The one thing you don't want to have happen is multiple simultaneous instances running with the same delay pending.
Another way this could be done (instead of above) is to make the Delay cancellable, and to Cancel Delay as the first action of the rule. So, each time the rule runs, a new 5 minute timer starts.
Reentrant would mean that each instance would have its own state, but all instances of a Rule share a single state. So it's not reentrant. However, it can run multiple times, and it can run while it is already 'running' (e.g., during the delay).
Reentrant (multi-instance) code is a reusable routine that multiple programs can invoke, interrupt, and reinvoke simultaneously . When you want to reuse code, but associate each instance of the shared code with unique, preserved data, use reentrant code.
Rule fails because it doesn't have "unique, preserved data" for each instance -- instead only a single copy.