It looks like you are missing the purpose of using ChangeDetectionStrategy.OnPush .
You do not have any @Input or | async | async on your component, but this is only the point of updating the state of the view using this strategy - when changing the input property (ideally with a new object). So just get rid of this for the current case.
UPDATE
if you still insist on using OnPush in this case, you must trigger change detection manually for the expected behavior.
Add import {..., ChangeDetectorRef} from '@angular/core'; and add it to the constructor.
In your method you should add this:
uniqueNameAsync(control: FormControl): Promise<{[key: string]:any}>{ return new Promise(resolve => { setTimeout(() =>{ resolve(null); this.changeRef.markForCheck(); }, 500); }); }
source share