申し訳ありませんが、ループする必要があります。それを回避することはできません。
また、他のすべての回答は、目的の要素を含む新しい配列を提供します。質問が示唆するように、同じ配列の要素を変更したい場合は、このようにする必要があります。
for (int index = 0; index < items.Length; index++)
    if (items[index] == "one")
        items[index] = "zero";
単純。
これが必要になるたびにコードにループを記述しないようにするには、メソッドを作成します。
void ReplaceAll(string[] items, string oldValue, string newValue)
{
    for (int index = 0; index < items.Length; index++)
        if (items[index] == oldValue)
            items[index] = newValue;
}
次に、次のように呼び出します。
ReplaceAll(items, "one", "zero");
拡張メソッドにすることもできます。
static class ArrayExtensions
{
    public static void ReplaceAll(this string[] items, string oldValue, string newValue)
    {
        for (int index = 0; index < items.Length; index++)
            if (items[index] == oldValue)
                items[index] = newValue;
    }
}
次に、次のように呼び出すことができます。
items.ReplaceAll("one", "zero");
あなたがそれに取り組んでいる間、あなたはそれを一般的にしたいかもしれません:
static class ArrayExtensions
{
    public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue)
    {
        for (int index = 0; index < items.Length; index++)
            if (items[index].Equals(oldValue))
                items[index] = newValue;
    }
}
呼び出しサイトは同じように見えます。
現在、これらのアプローチはいずれも、カスタム文字列等価チェックをサポートしていません。たとえば、比較で大文字と小文字を区別するかどうかを指定できます。を受け取るオーバーロードを追加して、IEqualityComparer<T>好きな比較を提供できるようにします。Tこれは、そうであろうとなかろうと、はるかに柔軟stringです。
static class ArrayExtensions
{
    public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue)
    {
        items.ReplaceAll(oldValue, newValue, EqualityComparer<T>.Default);
    }
    public static void ReplaceAll<T>(this T[] items, T oldValue, T newValue, IEqualityComparer<T> comparer)
    {
        for (int index = 0; index < items.Length; index++)
            if (comparer.Equals(items[index], oldValue))
                items[index] = newValue;
    }
}