Make a sprite black and white.

How to make a black and white sprite in unity4.3 without storing black and white copy of sprite and without runtime copying and modifying texture pixels.

In other words is it possible to set a custom shader for a SpriteRenderer? Or there is some other way.

You can do this in the shader. Keeping the apparent brightness the same but reducing to greyscale (which is what I assume you mean by B+W) would be something like:

Shader "Custom/Greyscale" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
		
			// Get the original texture colour
			half4 tex = tex2D (_MainTex, IN.uv_MainTex);
			
			// Get the apparent brightness
			half brightness = dot(tex.rgb, half3(0.3, 0.59, 0.11));

			// Set RGB values equal to brightness
			o.Albedo = brightness;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}

Finally I found it is possible to set a sprite renderer shader through

GetComponent().material.shader property