I've done similar things with a product called TRIM from HP rather than Sharepoint, but the basic principle is the same. In this case TRIM was accessible by users within the intranet and would hold the actual documents.
You create a custom object in Salesforce that can maintain the relationship between the Salesforce record and the unique identifier of the record stored in Sharepoint (probably a GUID).
You then create a formula field in Salesforce on the custom object that takes the GUID and creates a URL that the user within the intranet can access the sharepoint document with. For TRIM we were able to use a separate product called TRIM Easy Link.
The final part was to populate the relationship object in Salesforce when a document was uploaded to TRIM via the API.
There are a number of parts to such a solution, but it should work for Sharepoint as well.
Salesforce.com can connect to REST- and SOAP-enabled database servers. Unfortunately, older database servers, such as MySQL, do not support these modern protocols, instead depending on drivers and binary software libraries to expose their interfaces. ODBC is another common example of a "pre-Internet" protocol-- it relies on the existence of system drivers to provide the interface.
This means that, ultimately, any solution with Apex Code requires a middle-man approach. PHP can connect to MySQL and ODBC drivers, for example, so it would be possible to set up a server running PHP that can listen for incoming requests, translate the incoming request into a format that the other database system can understand, execute the command, then return the results back in REST or SOAP format (depending on the exact configuration of PHP code).
At the time of this answer, a cursory search on several popular search engines suggest that there is no open-source solutions written in PHP (or Perl, Ruby, ASP, JSP...) that addresses this need. However, there is an abundance of data on the Internet on how to write various scripts in any modern server scripting language, so it would simply be a matter of stitching that information together into a single coherent script.
Best Answer
I have solved it myself after a long research. The solution is to get connected to SharePoint Online with OAuth and leverage the power of SharePoint 2013 REST APIs. Features covered:
I have put all of my effort results as posts on my blog. Below are the blog post links.
SharePoint Online (O365) OAuth Authentication | Authorizing REST API calls against SharePoint Online Site | Get Access token from SharePoint Online | Set up OAuth for SharePoint Online Office 365
Complete SharePoint 2013 REST API Reference