Как работает .NET?
код превращается в IL, который уже будет превращаться в машинный по мере необходимости (см. JIT компиляцию). Т.е. по сути первый вызов метода будет происходить чуть дольше т.к. будет происходить оптимизация и компиляция IL кода под реальную аппаратную платформу. После чего все последующие вызовы будут выполняется быстрее. Если такой вариант по каким-то причинам не подходит - есть ngen который позволяет сразу скомпилировать код под известную платформу (выиграв на холодных запусках, по потеряв в переносимости). И в этом случае jit компиляция во время работы приложения уже выполнятся не будет. 

В CLR не входит CIL?
не совсем понял вопрос. cil/msil/il - просто промежуточный в который превращается код на С#/F#/VN.NET/etc. Можно расценивать его как ассемблер для .нета. Мало того, никто не запрещает написать свой DSL, который будет генерировать IL, который в свою очередь будет работать везде где работает .нет

JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?
оба варианта нет. jit компиляция = just-in-time и запускается прямо во время работы приложения. как-раз она и превращает IL код в нужный набор машинных кодов.
Когда вы нажимаете "зелёную кнопку" происходит следующее:

Visual studio вызывает .NET SDK
.NET SDK вызывает msbuild
msbuild в определённый момент вызывает csc.exe (C# Compiler)
csc.exe генерирует IL (aka MSIL, aka CIL) и заталкивает его в DLL-ки
^---- Это происходит при сборке проекта
<-- В этот момент на .net framework можно было натравить Ngen и пропустить чать JIT-компиляции
V---- А это при каждом запуске
Затем .NET Runtime берёт эти сборки и передаёт IL-код JIT-компилятору
Пока JIT в фоне компилирует IL в машинный код - рантайм интерпретирует IL
Когда IL скомпилировался - рантайм берёт сгенерированный машинный код
При этом в фоне JIT может собирать информацию о том, какие методы чаще вызываются, чтобы ещё их оптимизировать.


Ещё во время сборки проекта можно предварительно натравить JIT на код.
При запуске это позволит пропустить этап с интерпретацией и сразу запустить исполняемый код.
Эта фича называется ReadyToRun Compilation

Тут в одном из ответов посоветовали CLR via C# - я считаю, что это уже не самая актуальная книга, тк в .NET Core многое поменялось / дополнилось и могут отличаться нюансы.

Если хотите подробнее узнать про JIT - начните с этого доклада:
https://www.youtube.com/watch?v=H1ksFnLjLoY