If you not use setValue, Angular change the value but Angular not reflect in the input, don't mark the input as touched...
So
((this.myForm.get('array1') as FormArray)
.at(index1).get('array2') as FormArray)
.at(index2).get("type").patchValue(type);
or
this.form.get('array1.'+index1+'.array2.'+index2+'.type').patchValue(type)
NOTE1: using get to access at element of an array is the way array1.index, so array1.0 get the first element of the array, array1.1 the second one...
NOTE2: is recomended use the method get(name) vs controls[name]
Update I don't know yours requeriments, but If you want simple control an array of arrays of an object you can use a FormArray of FormArrays of FormGroup.
Well, some like
formArray=new FormArray([
new FormArray([
new FormGroup({
type:new FormControl('uno')
}),
new FormGroup({
type:new FormControl('dos')
}),
]),
new FormArray([
new FormGroup({
type:new FormControl('tres')
}),
new FormGroup({
type:new FormControl('cuatro')
}),
])
])
Can be mannage in an html as
<div *ngFor="let array of formArray.controls">
<div *ngFor="let group of array.controls" [formGroup]="group">
<input formControlName="type">
</div>
</div>
In this case use
(this.form.at(0) as FormArray).at(1).get('type').patchValue('new');
see stackblitz