По умолчанию, без использования malloc_check_ или mcheck(), glibc делает несколько небольших проверок, которые не вредят производительности, например, дважды вызывает free() на одном и том же участке памяти. Вот почему вы получаете некоторые из этих сообщений, но у вас не будет всех сообщений, предоставляемых malloc substitute api, которые вы можете получить, используя MALLOC_CHECK_ (которые делают намного больше проверок, но и намного более требовательны к вычислительной мощности). Вы можете проверить это, вызвав ошибку и протестировав ее с malloc_check_ и без него. Например, для простой double-free() я получаю ошибки "double free or corruption (top)" или "free(): invalid pointer" в зависимости от того, установил я MALLOC_CHECK_ или нет.
Чтобы ответить на вопрос 1/, mcheck полагается на хуки malloc с тех пор, как они существуют (около 15 лет), а они не предназначены для потокобезопасности.
Источники: glibc/malloc/malloc.c, http://sourceware.org/bugzilla/show_bug.cgi?id=9939