Hola,
1.- cada vez que se activa el un checkbox haces la sumatoria de todos los que estan activados, por lo que no necesitas restar, solo que no uses la variable sumatoria como una global, o inicializala a cero antes de cada sumatoria.
2.- Para conocer si la celda se encuentra activada, usa la propiedad "value" que al igual que las otras celdas es la que guarda la información, en este caso el valor booleano
3.- Lo mejor sería preguntar si el clic se hizo sobre esa celda para hacer el ciclo unicamente cuando activas un checkbox y no cuando das clic en otras celdas; pregunta por "e.ColumnIndex"
4.- la forma de hacer tu sumatoria no se si es realmente lo que quieres ya que vuelves a sumar lo que ya tenias a lo que viene
{
double sumatoria = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
bool chequeo = Convert.ToBoolean(row.Cells[5].Value ); //2.-
if (chequeo)
{
sumatoria += Convert.ToDouble(row.Cells[4].Value); //4.-
}
}
tbSumatoria.Text = Convert.ToString(sumatoria); //aqui se graba el total
tbSumatoria.Text = (double.Parse(tbSumatoria.Text)).ToString("#,#.00");
}
5.- lo que le falta a este codigo es que el evento ocurre antes de que cambie el valor de la celda, por lo que no hara la suma de la ultima celda activada, para solucionar eso te dejo este link:
http:\geeks.msblogsfernandezjaarchive2008 715datagridviewcheckboxcolumn-detectar-el-cambio-check-en-el-evento-cellvaluechanged.aspx
saludos