First of all make sure you are not binding the repeater on postback otherwise you're just resetting all the values to their initial state
if (!Page.IsPostBack)
{
}
Next you're only doing a js alert for the last question in the repeater. The "msg" param in RegisterClientScriptBlock is the key for that script block, and keys are unique, so if you have 5 questions you are trying to add 5 script blocks called "msg" but as msg is the key .net will only use the last one you configure as each block of that key replaces the previous ones. If you want an alert per question you need a unique key.
int i = 0;
foreach (RepeaterItem item in QuestionRepeater.Items)
{
RadioButton rb1 = (RadioButton)item.FindControl("rb1");
RadioButton rb2 = (RadioButton)item.FindControl("rb2");
RadioButton rb3 = (RadioButton)item.FindControl("rb3");
RadioButton rb4 = (RadioButton)item.FindControl("rb4");
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "msg" + (i++).ToString(), "alert('" + rb1.Text + ":" + rb1.Checked + rb2.Text + ":" + rb2.Checked + rb3.Text + ":" + rb3.Checked + rb4.Text + ":" + rb4.Checked + "');", true);
}
Note that as well as the unique key I also added a ";" after the alert.