This is harmless, except for heaptrc.
I've neave heard of HeapTrc hanging an app if a leak occurs. The only way I can think of that happening is if it's displaying a popup message that is being hidden from the user so they can't dismiss it.
( I believe I once used AddExitProc + a small procedure to fix that, but I am no longer using any Indy code whatsoever)
However,
AddExitProc is application-level, not library-level. If Indy were to use
AddExitProc, it could cause problems if Indy were compiled as an external package and then loaded/unloaded dynamically at runtime.
In Delphi, using ReportLeak.... function or FASTMM5 with debugger dll doesn't report or show anything. I tryed this sometimes ago, but I don't have any visible leaks on my software.
As stated earlier, in Delphi the "intentional" leaks in Indy are registered with the memory manager so they don't appear in leak reports. The default memory manager in FPC doesn't have that feature.
There are 2 TIDThread.Create which creates a critical section
and there is only 1 TIDThread.Destroy which free's a critical section
Improper cleanup code.
That's not what is happening. Especially since you say the problem occurs even without any Indy components being active.
Indy simply creates 2 global objects at initialization, and does not free them by default at finalization. That's the leak. Has nothing to do with threads being created and not cleaned up.
Ok, got all the leaks out.
there is also a commented section in the FINAIIZE section of the "IDSTACK", I uncommented that and rebuilt it all.
So these are the files:
IDTHREAD.PAS
IDSTACK.PAS
uncomment the sections in the finalize, and rebuild the IDE.
I am sure there are many more sitting in the soup can. 
The correct way to "fix" the leaks is to edit Indy's
IdCompilerDefines.inc to define
FREE_ON_FINAL (see lines 38-41):
// $DEFINE the following if the global objects in the IdStack and IdThread
// units should be freed on finalization
{.$DEFINE FREE_ON_FINAL}
{$UNDEF FREE_ON_FINAL}Change to:
// $DEFINE the following if the global objects in the IdStack and IdThread
// units should be freed on finalization
{$DEFINE FREE_ON_FINAL}
{.$UNDEF FREE_ON_FINAL}And then recompile Indy. No need to edit Indy's source code otherwise.