Maximum subarray problem in JavaScript
Objects being returned.
  


This is fine as long as you define a convention and stick to it.


  
  Usage of Infinity
  


Your use case looks fine, you're using it as an upper and lower bound.


  
  Usage of non-pure functions
  


This one is a little subjective. For an algorithm like this, it makes sense to only write pure functions as that can make debugging easier. Your code is readable and clear, if a little contrived, but I wouldn't worry too much about this. JavaScript is sort of a weird language to ask this about since most functions won't follow this rule especially when you do DOM manipulation and frontend JavaScript.


  
  Closures
  


Very common in JavaScript. You should explore node.js if you're interested in learning more.

Nit: var that = {};. Aside from being a completely uninformative and useless variable name, this declaration isn't needed. You can rewrite the return statement as:

return {
    find: function() {
        return max_sub_arr(0, arr.length - 1);
    }
};


Or even better:

return max_sub_arr(0, arr.length - 1);


I don't see why you need to return a function to be invoked.