정말 다양한 이유로 CoInitializeSecurity를 사용해야 할 이유가 있습니다. 저 개인적으로는 WSLAPI.DLL의 함수들을 이용하고 싶기 때문인데, 정말 안타깝게도 이 함수들은 Win32 API이지만 내부적으로 LXSS Manager를 감싼 형태에 불과하기 때문에 CoInitializeSecurity를 잘 불러줘야 합니다.
한참을 찾아보다 결국은 아래 글에서 설명하는 것처럼 닷넷 프레임워크든 닷넷 코어이든 관리 코드를 COM 인터페이스로 등록하고, Native Shim에서 CoInitializeSecurity를 원하는대로 불러준 다음, 해당 COM 인터페이스를 부르도록 하는 것이 가장 현실적인 방안같이 보입니다. (혹은 .NET 런타임 호스팅 API를 대신 부른다던가.)
@kevin13 님의 조언을 토대로 테스트를 좀 더 해봤는데, STAThread나 MTAThread 자체는 닷넷 코어든 닷넷 프레임워크든 CoInitializeSecurity를 부르는 트리거는 아닌 것 같습니다. 콘솔 앱에서는 Main 메서드에 저 어트리뷰트가 어떻게 붙든 상관이 없었고, 지정을 안하면 디폴트는 MTAThread를 붙인 것과 동일한 상태였습니다.
반면 COM에 대한 의존성이 있는 LINQPad나 PowerShell, 그리고 Windows Forms에서도 웹 브라우저 컨트롤을 추가한 후에 CoInitiailizeSecurity를 불러보니 확실히 RPC_E_TOO_LATE가 HRESULT로 반환되었습니다.