I do not think that multiple hosts are the problem. I am using the elapsed filter plugin with a single elasticsearch node and have noticed the same problem as you.
While it works, for the majority of time, sometimes I get an elapsed_end_without_start tag even though the start event is present.
One more problem I noticed is that if I do not add the periodic_flush setting the timeout setting never kicks in.
The event is never marked as expired and therefore no elapsed_expired_error tag is generated (unless I add the periodic_flush setting as mentioned above.
Is this a bug or the way it should works? I am asking because the periodic_flush setting is marked as optional.