Attributes.Addよりも>>642が教えてくれたように
OnClientClickプロパティにJavaScript書く方がスマートだね。

で,ちょっと実験してみたけどAttributes.AddでもOnClientClickでも
確かに&にエンコードされる。
けどどちらにしてもtypeの値は正しく取得できたよ?

以下,テストに使ったコードのサンプル
(インデントは全角スペースに置換したため注意)

protected void Page_Load(object sender, EventArgs e)
  {
    //以下の2行はどっちでも同じHTMLを出力される
    //Button1.Attributes.Add("onclick", "window.open('Default.aspx?id=0&type=test');");
    Button1.OnClientClick = "window.open('Default.aspx?id=0&type=test');";
    
    //GETパラメータの全てのキーと値をタイトルに設定
    foreach (string key in Page.Request.QueryString.Keys)
    {
      Page.Title += ":" + key + "=" + Page.Request.QueryString.Get(key);
    }
  }

ボタン(Button1)一個貼り付けて実行してみればわかるかと。