It's not strange at all. madExcept will be listed as part of every thread callstack. The reason for that is that madExcept has to hook itself into every thread, to be able to catch and report the exceptions properly. This is not (at all) an indication that madExcept would be causing the exception.
function CallThreadProcSafe(threadProc, param: pointer) : dword; stdcall;
// protect the stack, just in case the thread function is incorrect
asm
push ebx
mov ebx, esp
mov eax, [ebp+$c]
push eax
mov eax, [ebp+$8]
call eax
// if everything is alright, we should have "esp = ebp" here
cmp ebx, esp ; <-- access violation raises here!
Could be a thread function which has an incorrect calling convention, or an incorrect number of parameters, maybe? Or a thread function which has somehow overwritten its own stack (e.g. due to a buffer overrun on a local variable).