WaitForSeconds only working first time?

if (Vector2.Distance (transform.position, PlayerGet.transform.position) <= AttackDistance)
{
StartCoroutine (Attack ());
}
if (Vector2.Distance (transform.position, PlayerGet.transform.position) > AttackDistance)
{
StopCoroutine (Attack ());
}
}

it waits 1 second, then takes away 20 health per frame.

	IEnumerator Attack () {
		yield return new WaitForSeconds (1);
		PlayerGet.GetComponent <PlayerStats> ().Health -= Damage;
	}

Because you are creating new coroutine every frame.

You are checking distance in update, if condition is met you start new coroutine, that condition is checked every frame.

Either define a bool which triggers when coroutine starts running or retweak your whole logic.

private bool isRunning = false;

if (Vector2.Distance (transform.position, PlayerGet.transform.position) <=AttackDistance){
    if(!isRunning)StartCoroutine ("Attack");
}
if (Vector2.Distance (transform.position, PlayerGet.transform.position) >AttackDistance){
    if(isRunning){
        StopCoroutine ("Attack");
        isRunning = false;
    }
}

IEnumerator Attack () {
    isRunning = true;
    yield return new WaitForSeconds (1);
    PlayerGet.GetComponent <PlayerStats> ().Health -= Damage;
    isRunning = false;
}

Also, you can’t stop coroutines which aren’t passed like string.
If you call it this way StartCoroutine (Attack()); there is no way to stop it manually.

Mostly because you are calling multiple times.
Since the code you have revealed does not guaranty that only one coroutine is being called, it has multiple instances of Attack.