Threading single = Sua aplicação será iniciada sempre na mesma Thread em um só nível, ou seja, se vc precisar acessar duas ou mais vezes alguma função global ou friend da sua dll, essas tarefas serão "empilhadas" na mesma thread
Apartment Thread = Sua aplicação será aberta em uma Thread só, porém, para cada nova chamada à dll, uma nova thread será criada. Isso melhora o desempenho, mas se tiver grande fluxo de chamadas, pode fazer a máquina cliente ficar mais lenta.
A melhor forma de compilação depende do que sua aplicação vai fazer...
Quanto a unatended execution, eu não sei o que é.