The fastest method I have found uses Array.Copy with the copy size doubling each time through the loop.  The speed is basically the same whether you fill the array with a single value or an array of values.
In my test with 20,000,000 array items, this function is twice as fast as a for loop.
using System;
namespace Extensions
{
    public static class ArrayExtensions
    {
        public static void Fill<T>(this T[] destinationArray, params T[] values)
        {
            if (destinationArray == null)
                throw new ArgumentNullException(nameof(destinationArray));
            Array.Copy(values, destinationArray, Math.Min(values.Length, destinationArray.Length));
            if (values.Length >= destinationArray.Length)
                return;
            int arrayToFillHalfLength = destinationArray.Length / 2;
            int copyLength;
            for (copyLength = values.Length; copyLength < arrayToFillHalfLength; copyLength <<= 1)
            {
                Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
            }
            Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
        }
    }
}
I blogged about this at https://grax32.com/2011/11/initialize-array-to-value-in-c-very.html and https://grax32.com/2014/04/better-array-fill-function.html