По определению, все такие асинхронные вызовы не могут быть выполнены в блоке using, чтобы убедиться, что соединение закрыто. Таким образом, вызов EndExecutexxx необходим.
Глядя на код в отражателе, мы видим след закрытия соединения в EndExecuteNonQuery
:
SqlDataReader reader = this.CompleteAsyncExecuteReader();
if (reader != null)
{
reader.Close();
}