EndInvoke не является обязательным, потому что это место, где генерируются исключения, если что-то пошло не так в асинхронной обработке.
В любом случае не должно быть никакой утечки, потому что, если IAsyncResult содержит некоторый собственный ресурс, он должен правильно реализовать IDisposable и распоряжаться такими ресурсами, когда GC вызывает его финализатор.