Я не могу найти нигде на сайте MSDN, где это обсуждается. Однако многие функции, которые возвращают статические буферы, в MSVC уже поточно-ориентированы (то есть они возвращают указатели на локальные буферы потока). Поэтому было бы удивительно, если бы errno не был безопасен для потоков.
Все заголовочные файлы MSVC имеют следующее определение:
#ifndef _CRT_ERRNO_DEFINED
#define _CRT_ERRNO_DEFINED
_CRTIMP extern int * __cdecl _errno(void);
#define errno (*_errno())
errno_t __cdecl _set_errno(_In_ int _Value);
errno_t __cdecl _get_errno(_Out_ int * _Value);
#endif /* _CRT_ERRNO_DEFINED */
И небольшая тестовая программа показала, что установка 2 потоков, по крайней мере, не влияла друг на друга.
Поэтому я бы сказал, что можно предположить, что errno является потокобезопасным (хотя, вероятно, нет, если вы ссылаетесь на CRT с одним потоком)