Speed problems with SetValue, ToType and Reflection
Style  

Based on the naming guidlines method names should use PascalCasing casing.  

determineCanMessageValueFields()

Instead of calling Count() and checking if it is greater than 0 you should call Any().  

So determineCanMessageValueFields() would become  

private IEnumerable&lt;PropertyInfo&gt; determineCanMessageValueFields()
{
    return this.GetType().GetProperties()
                            .Where
                                (p =&gt; p.GetCustomAttributes(false)
                                            .Any(x =&gt; x.GetType() == typeof(IsValueField))
                                )
                            .OrderBy(x =&gt; ((IsValueField)x.GetCustomAttributes(false)[0]).ValueFieldIndex);
}


ConvertDataFrameToValueFields()  

The creation of the List&lt;byte[]&gt; is not needed at all. If you increment the i counter by 2 you can just use this.DataBytes for the calling BitConverter.ToUInt16(this.DataBytes,i).  

This leads after using Any()instead of Count() &gt; 0 to  

public void ConvertDataFrameToValueFields()
{

    int i = 0;

    foreach (var prop in DetermineCanMessageValueFields())
    {
        ushort value = BitConverter.ToUInt16(this.DataBytes, i);

        if (prop.PropertyType == typeof(MessageStatusValueField))
        {
            prop.SetValue(this, new MessageStatusValueField(value, prop.Name, this.UnitType), null);
        }
        else if (prop.PropertyType == typeof(MessageValueField))
        {
            prop.SetValue(this, new MessageValueField(value, prop.Name), null);
        }
        else if (prop.PropertyType == typeof(MessageValueFieldInt32))
        {
            prop.SetValue(this, new MessageValueFieldInt32(value, prop.Name), null);
        }
        else if (prop.PropertyType.GetCustomAttributes(false).Any(x =&gt; x.GetType() == typeof(BitmaskValueFieldClass)))
        {
            var tempField = new MessageValueField(value, prop.Name);
            prop.SetValue(this, Convert.ChangeType(tempField, prop.PropertyType), null);
        }

        i += 2;
    }
}


and applying the Any() change to the ToType() method  

public object ToType(Type conversionType, IFormatProvider provider)
{

    if (!conversionType.GetCustomAttributes(false).Any(x =&gt; x.GetType() == typeof(BitmaskValueFieldClass)))
    {
        throw new NotImplementedException("The conversion is only available for conversion types with the BitmaskValueFieldClass attribute");
    }

    var instance = Activator.CreateInstance(conversionType);

    foreach (var item in instance.GetType().BaseType.GetProperties())
    {
        item.SetValue(instance, this.GetType().GetProperty(item.Name).GetValue(this, null), null);
    }

    return instance;
}  


Comments  

Comments should be used to explain why something is done, not what is done. The what part should be done by the code itself.