How to perform set timer multiple times without timer handles being replaced/reset before they are cleared and invalidated?

Just create a new handle struct with each burn. If you need it for something then just return it in the AddBurn function.

void AMyCharacter::AddBurn() {	
	FTimerHandle BurnTimer;
	if (UWorld* World = GetWorld()) {
		World->GetTimerManager().SetTimer(BurnTimer, this, &AMyCharacter::Apply_burn_damage_for_duration, 2);
	}
}

void AMyCharacter::Apply_burn_damage_for_duration() 
{
	GEngine->AddOnScreenDebugMessage(-1,1,FColor::Orange, ("BURN"));
}

example actor is AMyCharacter in this case, replace it with your own.