The short answer is "no."
If you need to return a raw data model alongside your view, the only option is to embed the data in the view. The two options are:
In an HTML element (kind of awkward IMO):
<div id="myData" data-model="{"Name": "Jason"}"></div>
In script:
<script>
var myData = {Name: Jason};
</script>
I prefer the second method as there is no HTML escaping.
I agree it is kind of annoying to have to do this, but one request is one request... it is just one stream of data. Bootstrapping data in this way is fairly common, so maybe a future version of MVC will have a cleaner way to return it (but it would probably look just like one of my examples above).
Outside of that, as you mentioned, you can do an extra request to receive just the model in a JSON response.
EDIT:
I had a HtmlHelper up my sleeve to help with this...
public static MvcHtmlString ToScriptVariable<T, TMember>(this T value, Expression<Func<T, TMember>> expression) where T : class
{
var member = expression.Body as MemberExpression;
if (member == null)
throw new ArgumentException("Expression must be a member expression.", "expression");
var expressionValue = expression.Compile()(value);
var serializer = new JavaScriptSerializer();
var seralizedData = serializer.Serialize(expressionValue);
var tag = new TagBuilder("script");
tag.Attributes.Add("type", "text/javascript");
tag.InnerHtml = String.Format(CultureInfo.InvariantCulture, "var {0} = {1};", member.Member.Name, seralizedData);
return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
Usage:
<%: Html.ToScriptVariable(x => Model.MyData) %>
Result:
<script type="text/javascript">var MyData = "(whatever)"</script>