1. Полностью на ActiveRecord не получится, ибо он только для ANSI SQL, а ваш update двух таблиц будет работать только в MySQL.
Можно частично:
echo Mark::find()
->select(['user_id', 'name', 'new_marks_total' => new Expression('...')])
->with('user')
->where(['status' => ['oldest', 'old', 'new', 'newest']])
->andWhere(['IS NOT', 'user_id', null])
->andWhere(['IS NOT', 'name', null])
->groupBy('user_id')
->createCommand()
->rawSQL;
2. Но это все равно говнокод. Потому что при group by можно в select только это группируемое поле или групповые функции. Например, есть user с двумя mark. При группировке по user.id какая из двух mark должна быть в m.status?