I'm pretty sure that I found the source of the problem (and a solution) of vanishing leads.
It is related to the reading and writing of the NBT tag of the (leashed) entities.
When the entity is read from the NBT tag, the leash is not read directly, but the corresponding tag compound is first stored in a temporary variable (in MCP it's called field_110170_bx). Once the entity has its first update, this temporary variable is then used to attach the entity to another entity or to a leash knot, and the temporary variable is set to null.
The problem occurs when the entity is again written to an NBT tag before it had its first update, because it is not yet attached to something. But the writing method assumes that the lead has already been initialized, and therefore, no further information about the lead is stored. The next time, the entity is read from the tag, we have the information that it is leashed, but the information of where it is attached to has gone.
So, the problem can be solved by additionally checking on writing to the NBT tag, if the temporary tag compound variable for the leash (field_110170_bx) is not null. If this is the case, then the lead was not yet initialized, and it is necessary to store again the tag compound. I tried this and it worked.
I have to add, as already pointed out in earlier comments, there are actually two different bugs - one, where the leashes disappear completely, and one, where they disappear only visually. Both bugs have the same reason, but the solution that I suggested in my previous post only helps with the first one.
The second bug, where the leash is invisible, but the entities behave leashed, happens when the client does not know about the leash because it did not receive a corresponding packet from the server. This is because the server does not send a packet, if the tag for the leash was not yet read (i.e. the information is still only in the temporary variable field_110170_bx in the class EntityLiving).
This problem can be solved by sending a package at the end of the method that reads the leash tag, which is called func_110165_bF in class EntityLiving in MCP, analogously to the package that is sent when a leash is created in func_110162_b.
With this modification and the suggested modification in my previous comment, I could not observe any disappearing leashes.